Log4j的使用

来源:互联网 发布:nginx和zookeeper 编辑:程序博客网 时间:2024/06/06 04:19

Log4j简介

这是一个Apache的开源项目,是一个日志信息的管理框架,通过简单的配置,可以控制将日志信息输送到控制台,文件甚至是其他例如事件记录器,Unix Syslog守护进程。
优点:
1、配置简单,只需要简单地对properties或者xml文件进行配置,即可实现日志记录的需求。就算是从来没有用过的新手也一定可以在15分钟以内照着例子入门。
2、灵活性高,可以控制每一条日志的输出格式、级别以及输出到控制台还是文件或是其他地方,能跟细致地控制每一条日志的生成过程。
3、与其他java代码的耦合度不高,除了需要记录日志的地方需要显式调用写日志的方法,其余对日志属性的修改只需修改配置文件,根本无需对源代码作任何修改。

使用

先以一个简单结构的java项目为例,日志的配置文件支持xml和properties,这里就介绍properties文件的配置。先建立如下结构的项目。log4j.properties必须为这个名字,且必须放在源文件根目录下
这里写图片描述
当然如果是web项目,也可以在web.xml中修改配置文件的路径。

    <context-param>        <param-name>log4jConfigLocation</param-name>        <param-value>classpath:config/log4j.properties</param-value>    </context-param>

在工程中加入log4j的jar包,我用的1.2.17版本的。
1、Test文件用来输出日志,代码如下:

package log4j.test;import org.apache.log4j.Logger;public class Test {    private static Logger   log = Logger.getLogger(Test.class);    public static void main(String[] args) {        // 使用默认配置进行输出,这里用代码设置的优先级高于配置文件        // BasicConfigurator.configure();        // 设置日志输出的最低级别,这里用代码设置的优先级高于配置文件        // log.setLevel(Level.ERROR);        log.fatal("this is fatal log");        log.error("this is error log");        log.warn("this is warn log");        log.info("this is info log");        log.debug("this is debug log");    }}

上面的java代码中先要获取一个log对象,参数可以是类的完全限定名字符串,也可以是类名.class,为了将这个类注册到log以便使用日志输出功能。日志根据级别也可以分为fatal,error,warn,info,debug,它们的级别依次由高到低,当然还有all和off级别的,我们一般不用。
2、接下来的重头戏就是properties文件:
在此之前介绍几个概念:
(1)appender:表示日志以何形式写出,一般常用的有:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到指定尺寸时产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(2)layout:日志的输出格式,一般常用的有,最常用的是第二种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印到控制台

现在配置第一个日志输出,将日志输出到控制台。
1、首先每个配置文件这一句一定必不可少,可以理解为日志的根,固定写法,debug的意思是,打出级别至少为debug的日志,stout是自定义的日志输出,下面一切自定义的日志输出都要“注册”到这里,否则无法打印!

#根loggerlog4j.rootLogger=debug,stdout   

2、自定义日志输出,如下定义一个输出到控制台的日志输出。
log4j.appender.stdout中stdout为自定义输出的名称,对应的值就是上面列举appender中的值。

log4j.appender.stdout.layout代表名为stdout的日志输出的样式,就是上面layout列举的值,每一个appender都有此属性。

log4j.appender.stdout.layout.ConversionPattern表示日志输出的具体格式,其中的%x都有特定含义,下面会给出解释,每一个appender都有此属性。
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即debug,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为” “,Unix平台为”“输出日志信息换行
另外也可类似C语言用%5d,%-5c等进行缩进
例如:%-4r %-5p %d{yyyy-MM-dd HH:mm:ss SSS} %c %m%n

#输出到控制台log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[%-5p][%l]->%-20m[%d]%n

3、配置完毕,运行Test类,控制台是不是就打出日志了呢。如果控制台有警告一定是哪里配置有问题,根据提示修改即可。

输出到单个文件

我们将日志文件打印到控制台仅仅是为了可以在debug时看到具体的信息,但是无法将日志记录下来,如果系统上线以后有问题,我们根本没有记录可以查看,这是非常不方便的。因此要控制将日志输出到文件进行保存。
encoding属性指定字符集编码,每一种appender都有此属性,指定字符集编码,防止乱码的产生。

Threshold是日志子类别,我们在rootLogger中定义了全局的级别为debug,但是有时候我们需要的最低日志级别不一定就是从debug开始的,因此这个属性可以指定子类别中的日志最低级别。

file:日志输出的目标文件路径,这里是本地路径,当然也可以是web路径,盘符完全可以是${web.root},这个值对应的就是web.xml中的这个值,任何与输出目标为文件的自定义日志都有此属性。

    <context-param>        <param-name>webAppRootKey</param-name>        <param-value>web.root</param-value>    </context-param>

immediateFlush:每一个appender都有此属性,表示日志是不是实时刷出来,还是当缓存到一定量再输出

append:表示每次输出的日志是直接在上次的文件内容后面追加还是讲之前的内容直接覆盖掉。

log4j.appender.fout=org.apache.log4j.FileAppenderlog4j.appender.fout.encoding=utf-8log4j.appender.fout.Threshold=infolog4j.appender.fout.file=C:/Users/Administrator/Desktop/log.loglog4j.appender.fout.immediateFlush=truelog4j.appender.fout.append=truelog4j.appender.fout.layout=org.apache.log4j.PatternLayoutlog4j.appender.fout.layout.ConversionPattern=[%p][%l]->%m[%d]%n

写完不要忘记将fout写到rootLogger后面!

输出到按日期滚动的日志文件

上面输出到文件虽然实现了将日志进行保存,但是无论有多少日志都是存在一个文件里,最后的结果是,日志文件大小很大,而且想要查找特定时间内的日志也很不容易,因此我们需要一种方案来实现日志的按日期进行滚动。

datePattern:是日志文件名称中时间部分的命名,同样也控制了日志文件究竟以什么时间单位进行滚动,这个属性要放在file之前,我把它放在file后面发现居然没用!!!另外.log是拼接在datePattern后面的!下面是常用的表达式:
‘.’yyyy-MM,对应monthly(每月)
‘.’yyyy-ww,对应weekly(每周)
‘.’yyyy-MM-dd,对应daily(每天)
‘.’yyyy-MM-dd-a,对应half-daily(每半天)
‘.’yyyy-MM-dd-HH,对应hourly(每小时)
‘.’yyyy-MM-dd-HH-mm,对应minutely(每分钟)

log4j.appender.dfout=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.dfout.append=falselog4j.appender.dfout.datePattern='.'yyyy-MM-dd-HH-mm'.log'log4j.appender.dfout.file=C://Users/Public/Desktop/dfloglog4j.appender.dfout.immediateFlush=truelog4j.appender.dfout.layout=org.apache.log4j.PatternLayoutlog4j.appender.dfout.layout.ConversionPattern=[%p][%l]->%m[%d]%n

写完不要忘记将fout写到rootLogger后面!

按日志文件大小进行滚动

有时防止单个日志文件大小过大,可以按文件大小进行日志的滚动。
maxFileSize:后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到rflog.log.1文件

maxBackupIndex:可以产生的滚动文件的最大数。

log4j.appender.rfout=org.apache.log4j.RollingFileAppenderlog4j.appender.rfout.file=C://Users/Public/Desktop/rflog.loglog4j.appender.rfout.encoding=UTF-8log4j.appender.rfout.maxFileSize=1KBlog4j.appender.rfout.maxBackupIndex=2log4j.appender.rfout.layout=org.apache.log4j.PatternLayoutlog4j.appender.rfout.layout.ConversionPattern=[%p][%l]->%m[%d{yyyy/MM/dd HH:mm:ss}]%n

打印特定包下面的日志

例如下面就是打印ibatis包下所有大于debug级别的日志,记得打印mybatis日志的时候注意,如果jar包同时有slf4j,和log4j可能会导致sql语句无法打印,因为slf4j优先级大于log4j,且有冲突。
注意:上面的自定义输出日志都是以log4j.appender开头的,这里是log4j.logger.包(类)的全局限定名

log4j.logger.com.ibatis=debug

但是这样打印也只会将文件打到控制台,如果要将sql语句和执行结果保存到日志文件,可以作如下修改,fout就是之前自定义的输出到文件的日志,当然也可以是以其他appender的形式进行输出。

log4j.logger.com.ibatis=debug,fout

好了,上面基本就是常用的配置,一般项目开发过程中,具体如何配置需要根据具体需要来,切不可将不同项目之间的配置生搬硬套。
下面附上一些常用的配置:
1、打印数据库相关的:

log4j.logger.java.sql.Connection=debuglog4j.logger.java.sql.Statement=debuglog4j.logger.java.sql.PreparedStatement=debuglog4j.logger.java.sql.ResultSet=debug

2、打印Mybatis相关(一般和1一起用)

log4j.logger.com.ibatis=debuglog4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debuglog4j.logger.com.ibatis.common.jdbc.ScriptRunner=debuglog4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug

3、hibernate相关(一般和1一起用)

log4j.logger.org.hibernate.SQL=trace   log4j.logger.org.hibernate.type=trace log4j.logger.org.hibernate.tool.hbm2ddl=debug   log4j.logger.org.hibernate.hql=debug   log4j.logger.org.hibernate.cache=debug  log4j.logger.org.hibernate.transaction=debug   log4j.logger.org.hibernate.jdbc=debug   log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace  log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  log4j.logger.org.springframework.jdbc.core.JdbcTemplate=debug

4、struts相关

log4j.logger.org.apache.struts=debug

5、JdbcTempalte

log4j.logger.org.springframework.jdbc.core.JdbcTemplate=debug

6、Spring相关

log4j.logger.org.springframework=debug
0 0
原创粉丝点击