浅谈怎么样行使Log4j记录日志

  一.什么是log4j

序言:由于那段日子公司的事情比较的辛勤,每一天都要上学新的事物,所以长时间没有写博客了,前几日忙里偷闲写写博客来记录本人那段时光商量的东西,给协调加深一下影像,小编用easyUI的零件开发了1个简单易行操作数据库的小样例,一些常用的数据库操作都完结了,希望能和博客园里面包车型客车博主们调换交换看法。

 Log4J是Apache的2个怒放源代码的连串。通过使用Log4J,程序员能够操纵日志新闻输送的指标地,包含控制台,文件,GUI组件和NT事件记录器,也得以控制每一条日志的出口格式,或通过定义每一条日志音讯的级别,尤其细心地决定日志的变迁进度。

首先本身用的支付环境是Visual Studio 2008,ASP.NET MVC2.0,SQL
SE奥迪Q3VE翼虎2006,作者用的NHibernate的版本是1.2.1,Spring.net的版本是1.1.0。

  二.日志及分类

第3在此地将自身的思疑先说出去,希望有人能够给本身解答解答,在此间谢过了,笔者在用版本的时候笔者发现NHibernate1.2.1和spring.net1.1.0(低版本)结合最好,Nhibernate3.0和spring.net
1.3.1(高版本)结合做好,不明白自家的以为正确吧?可是低版本的话无法使用Nhibernate.Linq,唯有Nhibernate3.0以上的版本援救Nhibernate,但是高版本的话大家项目里面有2个成效大家并未做出来,正是我们有意识把数据库的连日字符串写错误,然后自个儿执行不通过多少操作的页面包车型地铁话,比如那么些页面作者就输出一句话,不过也会报错,说不只怕连接数据库,用户登录战败,可是自身想要的是在尚未操作数据库的页面可以平常呈现,在操作数据库的页面在提示错误即可?不明白哪位博友有啥样好措施吧?那种效益在低版本上面笔者得以达成了。

     
软件的周转进度中离不开日志,日志主要用来记录系统运转进度中的一些首要的操作新闻,便于监视系统运维时的意况,帮忙用户提前意识和回避恐怕出现的题材,大概出现难点后依据日志找到爆发的缘由。

  1. 首先步:建立数据库

 
 日志依照记录的不相同,主要分为三类:

(1)    打开数据库SQL Server
二〇〇六,新建三个数据库bjk241,然后再此数据库中新建一张表,起名为:User_DepInfo,用来存放大家录入的数据,表的建立样式如下图所示:

1.SQL日记:记录系统实施的sql语句。

 

2.老大日志:记录系统运作中生出的不得了事件。

图片 1

3.业务日志:记录系统运作进度,如用户的报到,操作记录。

  1. 其次步:建立项目,类库等

三.布置文件表明

(1) 打开Visual Studio 2010集成支付环境,在Visual Studio
20第10中学确立一个ASP.MVC
2.0的品种,给品种其名称是NewKJ241,将会转移微软封装好的自带的MVC的上上下下框架结构结构,然后在项目里面建立多少个类库,用来存放小编在后面建立的一些档次,当大家树立完结之后如图所示:

一 、定义配置文件
Log4j协助二种配备文件格式,一种是XML格式的文本,一种是Java特性文件log4j.properties(键=值)。上面将介绍使用log4j.properties文件作为配置文件的方式:
①配置根Logger
Logger 负责处理日志记录的多数操作。
其语法为:
log4j.rootLogger = [ level ] ,
appenderName, appenderName, …
在那之中,level
是日记记录的优先级,分为OFF、FATAL、E中华VRO奥德赛、WA冠道N、INFO、DEBUG、ALL只怕自定义的级别。Log4j建议只利用七个级别,优
先级从高到低分别是E奥迪Q5RO中华V、WAOdysseyN、INFO、DEBUG。通过在此地定义的级别,您能够控制到应用程序中相应级别的日记新闻的开关。比如在此处定
义了INFO级别,唯有等于及超越那个级别的才实行拍卖,则应用程序中有所DEBUG级其他日记消息将不被打字与印刷出来。ALL:打字与印刷全部的日志,OFF:关
闭全部的日记输出。
appenderName正是点名日志新闻输出到哪个地点。可同时内定八个出口指标地。
②配备日志音信输出目标地 Appender
Appender 负责控制日志记录操作的出口。
其语法为:
log4j.appender.appenderName =
fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 =
value1
log4j.appender.appenderName.optionN =
valueN
那边的appenderName为在①里定义的,可任意起名。
其间,Log4j提供的appender有以下三种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每一日产生二个日记文件),
org.apache.log4j.RollingFileAppender(文件大小到达钦定尺寸的时候发出一个新的文书),可透过
log4j.appender.奥迪Q5.马克斯FileSize=100KB设置文件大小,还可由此log4j.appender.宝马X3.MaxBackupIndex=1设置为保留二个备份文件。
org.apache.log4j.WriterAppender(将日志音信以流格式发送到任意钦命的地点)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
概念贰个名为stdout的输出目标地,ConsoleAppender为控制台。
③配置日志新闻的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout =
fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 =
value1

log4j.appender.appenderName.layout.optionN =
valueN
内部,Log4j提供的layout有以下二种:
org.apache.log4j.HTMLLayout(以HTML表格方式布局),
org.apache.log4j.PatternLayout(能够灵活地内定布局格局),
org.apache.log4j.SimpleLayout(包涵日志音讯的级别和音信字符串),
org.apache.log4j.TTCCLayout(包罗日志爆发的年华、线程、种类等等新闻)
② 、格式化日志新闻
Log4J采纳类似C语言中的printf函数的打字与印刷格式格式化日志新闻,打字与印刷参数如下:
%m 输出代码中钦赐的音信
%p 输出优先级,即DEBUG,INFO,WARubiconN,E奇骏RO昂科拉,FATAL
%r 输出自应用运营到输出该log新闻成本的纳秒数
%c 输出所属的类目,平时正是所在类的真名
%t 输出发生该日志事件的线程名
%n 输出三个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时刻,暗中同意格式为ISO8601,也足以在其后钦命格式,比如:%d{yyyy
MMM dd HH:mm:ss,SSS},输出接近:2000年5月二三日 22:10:28,921
%l 输出日志事件的产生地方,包涵类目名、发生的线程,以及在代码中的行数。

 

四.怎么样使用log4j记录日志

图片 2

 
 要使用log4j记录日志,首先要下载log4j的jar文件,官方网站是http://logging.apache.org/log4j。当前下载地址是:http://logging.apache.org/log4j/1.2/dowload.html.下载好该文件,解压后有一个apache-log4j-1.2.17\\log4j-1.2.17.jar文件.

(2)
当我们见到那张图的时候,大家是或不是在纳闷那都以为啥的呢?不要心急,上边小编就介绍一下梯次项目和类库的功力。

第叁步:在品种中进入log4j所利用的jar文件

  1)
首先大家来看了NewKJ241里面包车型大巴始末和我们刚创立的分裂啊,那是因为自己重新建立了多少个文本夹,将尚未的文书夹介绍一下,Configs文件夹里面放的是spring.net的XML节点,落成的功力是链接数据库和照耀整个框架,上面作者会详细介绍的,dlls文件夹里面放的是我们所要引用的dll,如图所示:

 
 首先在档次中开创二个lib文件夹,把该文件复制该公文中。然后对曾经复制过来的jar包鼠标点击右键,选中BuildPath
 ——–》Add to Build Path
然后你会在档次中见到多了1个引入外包的品类:Library

 

图片 3

图片 4

第二步:创建log4j.properties文件

,easyUI文件夹里面是存放在的是大家须求引用的easyUI的类库,其余的都是树立的时候自动生成的,后边会研讨的。

 
选用要利用的log4j项目,点击src,依次选拔New————》File———New
File——–》输入文件名,单击Finish按钮,甘休创造。‘

  2) NewKJ241.Model类库的职能是存放映射的数据库的文书。

其三步:编写log4j.properties文件,配置日志音信。

  3)
NewKJ241.IDao类库的效能是促成了我们所急需的在类型中落到实处数据库方法的接口。

log4j.rootLogger=Info,file, stdout


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

  4) NewKJ241.
NhibernateDao类库的功效是促成了IDao的接口,达成了接口所要完毕的格局的代码。

五.日志及级别

 
5)NewKJ241.IBLL类库的效果是贯彻了我们在品种中要利用Spring.NET所要使用的接口,和NewKJ241.IDao接口的写法一模一样。

每一个Logger都被了叁个日志级别(log
level),用来支配日志音信的出口。日志级别从高到低分为:
01.off       
 最高阶段,用于关闭全数日志记录。
02.fatal      
提出种种严重的荒谬事件将会招致应用程序的脱离。
03.error      提议尽管发出错误事件,但仍旧不影响系统的存在延续运维。
04.warm     注明会油但是生神秘的一无可取情状。
05.info         一般和在粗粒度级别上,强调应用程序的运行全程。
06.debug     一般用来细粒度级别上,对调节应用程序格外有援救。
07.all          
最低等级,用于打开装有日志记录。

 
6)NewKJ241.BLL类库的法子是落到实处了Nhibernate的落实格局,继承自IBLL项目,是为了利用Spring.NET所写的点子。

六.在先后中选择lpg4j记录日志

上面小编就讲自身写的事物详细的描述一下,有啥不足或许缺点大家能够钻探。

package cn.hyj.one;
import org.apache.log4j.Logger;
public class Test {

    //通过Logger的getLogger获取一个Loogger实例
    public static Logger lo=Logger.getLogger(Test.class);
    public static void main(String[] args) {
        try {
            int result=5/0;//出现异常
        } catch (Exception e) {
            System.out.println("除数不能为零!");
            lo.info("除数不能为0");//保存日志
        }

    }
}
  1. 其三步:NHibernate映射文件

 

(1)
首先大家要映射出数据库中表的新闻的文本,这里大家怎么映射呢,那么多的代码??别着急,大家能够用八个自动生成映射文件的机件CodeSmith软件,那一个软件能够快速的提携大家生成映射文件,关于那个软件怎么利用能够看本人原先写的篇博客,那里详细的叙述了什么使用这些软件:http://www.cnblogs.com/hanyinglong/archive/2012/04/21/2462302.html

(2)
接下来大家在NewKJ241.Model里面建立贰个文件夹Mappings,在那一个文件夹里面我们存放了炫耀的文书,生成之后附加到花色中如图所示:

 

图片 5

1) 
UserDepInfo的作用是概念数据库中的字段,再用CodeSmith生成的时候情势字段属性是不加Virtual的,我们人为的给字段属性加上,代码如下:

        protected int _id;

        protected int _depID;

        protected string _depName;

        public UserDepInfo() { }

        public UserDepInfo(int depID, string depName)

        {

            this._depID = depID;

            this._depName = depName;

        }

        public virtual int Id

        {

            get { return _id; }

            set { _id = value; }

        }

        public virtual int DepID

        {

            get { return _depID; }

            set { _depID = value; }

        }

        public virtual string DepName

        {

            get { return _depName; }

            set

            {

                if (value != null && value.Length > 50)

                    throw new ArgumentOutOfRangeException(“Invalid value
for DepName”, value, value.ToString());

                _depName = value;

            }

        }

2)
然后映射文件的代码如下:注意,在此地大家必要把那个XML文件改成嵌入的财富,不然后边大家事先不了作用,怎么改呢?很简短,右键——属性——生成操作改成嵌入的能源,那样就OK了,先前时代准备工作完结了上边大家就起来写方法了。在此间又看不懂是什么样意思的,能够看笔者的博客:http://www.cnblogs.com/hanyinglong/archive/2012/04/20/2459314.html

<?xml version=”1.0″ encoding=”utf-8″ ?>

<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.2″

                   assembly=”NewKJ241.Model.UserDepInfo”

                   namespace=”NewKJ241.Model.UserDepInfo”>

  <class name=”NewKJ241.Model.UserDepInfo,NewKJ241.Model”
table=”User_DepInfo” lazy=”false”>

   
<!–下边是选拔缓存所使用的一句话,不过本项目里面包车型大巴二级缓存注释掉了,所以那边也诠释–>

    <!–<cache usage=”read-write”/>–>

    <!–部门表主键ID–>

    <id name=”Id” type=”Int32″ unsaved-value=”null”>

      <column name=”ID” length=”4″ sql-type=”int” not-null=”true”
unique=”true”/>

      <generator class=”native” />

    </id>

    <!–部门表ID–>

    <property name=”DepID” type=”Int32″>

      <column name=”DepID” length=”4″ sql-type=”int”
not-null=”false”/>

    </property>

    <!–部门表名称–>

    <property name=”DepName” type=”String”>

      <column name=”DepName” length=”50″ sql-type=”varchar”
not-null=”false”/>

    </property>

  </class>

</hibernate-mapping>

  1. 第伍步:建立Dao接口,实现操作数据库的艺术

(1)
在NewKJ241.IDao类库下边新建三个类,起名为:IUserDepInfoDao,然后在此类中写要贯彻格局的接口,代码如下:

  //where评释了对品种变量T的自律关系,where T :
class表示项目变量T是继续自class可能class本人

    public interface IUserDepInfoDao<T> where T : class

    {

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name=”id”>主键</param>

        /// <returns>实体</returns>

        T Get(object id);

 

        /// <summary>

        /// 获取实体

        /// </summary>

        /// <param name=”id”>主键</param>

        /// <returns>实体</returns>

        T Load(object id);

 

        /// <summary>

        /// 插入实体

        /// </summary>

        /// <param name=”entity”>实体</param>

        /// <returns>插入的数目</returns>

        object Save(T entity);

 

        /// <summary>

        /// 修改实体

        /// </summary>

        /// <param name=”entity”>实体数据</param>

        void Update(T entity);

 

        /// <summary>

        /// 保存恐怕涂改实体

        /// </summary>

        /// <param name=”entity”>实体数据</param>

        void SaveOrUpdate(T entity);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param name=”id”>主键ID</param>

        void Delete(object id);

 

        /// <summary>

        /// 删除实体

        /// </summary>

        /// <param
name=”odList”>主键ID的成团,删除多少个项</param>

        void Delete(string idList);

 

        /// <summary>

        ///读取假使用户不输入任何新闻进行询问的点子

        /// </summary>

        /// <param name=”sort”>遵照某些字段进行排序</param>

        /// <param name=”order”>依照某些字段进行排序</param>

        /// <returns></returns>

        IList<UserDepInfo> loadByAll(string sort, string order);

 

        /// <summary>

        /// 读取用户输入条件实行询问的点子

        /// </summary>

        /// <param name=”sort”>依照有些字段举行排序</param>

        /// <param name=”order”>依照有些字段实行排序</param>

        /// <param name=”name”>只用户输入的音讯</param>

        /// <returns></returns>

        IList<UserDepInfo> loadAllCheck(string sort, string order,
string name);

 

        /// <summary>

        ///

        /// </summary>

        /// <param name=”total”>总的数量</param>

        /// <param name=”page”>当前的页数</param>

        /// <param name=”rows”>每页所体现的数额</param>

        /// <param name=”order”>遵照某些字段举行排序</param>

        /// <param name=”sort”>依照某些字段实行排序</param>

        /// <param name=”DepName”>只用户输入的新闻</param>

        /// <returns></returns>

        IList<UserDepInfo> LoadAllByPage(out long total, int page,
int rows, string order, string sort, string DepName);

}

那里就没怎么说的了,写法都很稳定!!

  1. 第⑥步:建立NhibernateDao项目,完成IDao接口的主意

(1)
在NewKJ241.Nhibernate类库下边建立类,起名为:UserDepInfoDao,在该办法中持续自IDao接口,达成了IDAO接口里面包车型客车富有办法,在挥洒本代码的时候,我们无法不引入dll,引入的dll如图所示:

 

图片 6

代码如下:

 public class UserDepInfoDao<T> : HibernateDaoSupport,
IUserDepInfoDao<T> where T : class

    {

        public T Get(object id)

        {

            return this.HibernateTemplate.Get<T>(id);

        }

 

        public T Load(object id)

        {

            return this.HibernateTemplate.Load<T>(id);

        }

 

        public virtual object Save(T entity)

        {

            return this.HibernateTemplate.Save(entity);

        }

 

        public void Update(T entity)

        {

            this.HibernateTemplate.Update(entity);

        }

 

        public void SaveOrUpdate(T entity)

        {

            this.HibernateTemplate.SaveOrUpdate(entity);

        }

 

        public void Delete(object id)

        {

            var entity = this.HibernateTemplate.Get<T>(id);

            if (entity == null)

            {

                return;

            }

            else

            {

                this.HibernateTemplate.Delete(entity);

            }

        }

 

        public void Delete(string idList)

        {

            string[] idl = idList.Split(‘,’);

            int len = idl.Length;

            for (int i = 0; i < len; i++)

            {

                var entity =
this.HibernateTemplate.Get<T>(int.Parse(idl[i].ToString()));

                if (entity == null)

                {

                    return;

                }

                else

                {

                    this.HibernateTemplate.Delete(entity);

                }

            }

        }

 

        public IList<UserDepInfo> loadByAll(string sort, string
order)

        {

            string hql = “from UserDepInfo order by ” + sort + ” ” +
order;

            return
this.HibernateTemplate.Find<UserDepInfo>(hql).ToList();

 

        }

 

        public IList<UserDepInfo> loadAllCheck(string sort, string
order, string name)

        {

            string hql = “from UserDepInfo where DepName like ? order by
” + sort + ” ” + order;

            return this.HibernateTemplate.Find<UserDepInfo>(hql,
new object[] { “%” + name + “%” }).ToList();

        }

 

 

        public IList<UserDepInfo> LoadAllByPage(out long total,
int page, int rows, string order, string sort, string DepName)

        {

            IList<UserDepInfo> list = null;

            if (DepName == null)

            {

                list = this.loadByAll(sort, order);

            }

            else

            {

                list = this.loadAllCheck(sort, order, DepName);

            }

            total = list.LongCount();

            list = list.Skip((page – 1) * rows).Take(rows).ToList();

            return list;

        }

}

嘿,工作一天了,累了,回母校了,明日后续,今日写的那个都以基础,前面还会在写那么些项指标,一贯到这些项目写完!!,也是最有知识点了,所谓学习吧,一步三个脚印,渐渐来啊!!!

 

下载地址:http://www.chuxinm.com/Shop/Detail/Detail?id=b88e9907dbaa4b3db297443081ab238d

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图