log4j学习笔记(二)——log4j.xml的配置

作为一只小菜,总是觉得日志是一个很吊的东西。之前的日志都是师傅们配的,趁着有空想好好学一下,但是看帖子呀教程呀讲的确实对我这种菜鸟帮助不多,老大让我去看文档,英文的看得我一脸懵逼,没办法,跟中文的对比着好好学了一下,写出来希望对自己,也对跟我一样想学又对英文文档有点怵的小伙伴有些帮助。


一、三个首要组件之一:Logger


从 log4j的1.2版本起,Logger已经取代了Category。它遵循层次的(hierarchical)命名规则(假如一个记录器的名称后面跟着一个被认为是子记录器前缀的“.”号,那么它就被认为是另一个记录器的祖先)。


例如,名称为“com.foo”的Logger是名称为“com.foo.Bar”的父。相似的是,“java”是“java.util”的父,是“java.util.Vector”的祖先。这个命名规则对大多数的开发人员来说应该是很熟悉的。


看到三个组件的时候,可能会有疑问:为什么没有从别人代码里看到的<root>呢?

答:其实root全名叫做 root logger,它处于Logger层次的顶端,个人理解跟java里的Object一个地位。


root logger 和其它 logger 的区别有两点:

1、它总是存在的

2、其它logger必须设置name,并可以在代码里通过name获得,而root不能设置name,且不能通过name获得

public class Logger {
 
    // Creation & retrieval methods:
    public static Logger getRootLogger();
    public static Logger getLogger(String name);

    ... ...
}


Level (日志级别)

日志级别由高到低为 OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。

Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。


每个Logger都有自己的日志级别,通常没有指定级别的Logger会继承祖先Logger的Level。这里盗一张图,很清晰的解释了这个关系:



看到这里,肯定会有疑问:这个级别看着好像很有用,但是具体怎么用呢?

答:在代码里我们会使用Logger的debug, info, warn, error, fatal方法来打印日志,<logger>中的<level>的作用就是用来进行筛选的,只有>=该级别的日志请求才能被执行,反之不能输出(DEBUG < INFO < WARN < ERROR < FATAL)。例如:

    <logger name="com.xujingshi.dao">
        <level value="warn" />
    </logger>
那么dao中所有的log.info() 以及 log.debug() 都不会执行输出。

题外话:有些小白可能觉得在配置文件里定死了这个level,那谁会在代码里写比这个level更低优先级的log呀。其实如果是昨天我还会有这样的疑惑(23333),因为一个项目在不同的时期它所使用的资源文件是不同的(如qa,beta等),所以这个优先级的设置是很有必要的。

二、三个首要组件之二:Appender


Appender就很好理解了,我们可以称它为输出源,它的输出方式包括包括:

ConsoleAppender(控制台)
FileAppender(文件)
DailyRollingFileAppender(每天产生一个日志文件)
RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
WriterAppender(将日志信息以流格式发送到任意指定的地方)


Appender可以定义一系列的<param>,如:File(输出的文件名),Encoding(输出的编码格式)等


也可以定义<filter>过滤器,常用的有LevelRangeFilter,用来进行日志级别过滤。其它的没有遇到过,在logback里有一个EvaluatorFilter,用来评估、鉴别日志是否符合指定条件。


我们可以给一个Logger配置多个Appender,同时,给父Logger配置的Appender默认会被子Logger继承的,如

    <root>
        <priority value="debug" />
        <appender-ref ref="CONSOLE" />
        <!--<appender-ref ref="ERROR-APPENDER"/>-->
    </root>
那么所有的Logger都会拥有CONSOLE这个输出源,如果不想继承父Logger的Appender,那么设置属性additivity=“false”即可。


注意:我在测试的时候发现,如果父Logger配置了一个Appender,而子Logger又配置了同一个Appender,那么日志会被打印两次,所以,一定要注意避免这样的问题出现。

三、三个首要组件之三:Layout


我们所能看到的日志的输出格式就是由Layout来定义的,这里,借用一下别人的总结,日志信息格式中的符号含义:

-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平台为"/r/n",Unix平台为"/n"输出日志信息换行  
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:  
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。  
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。  
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。  
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。  


%m其实是最重要的,它会输出这条日志执行的真正的操作,上面写的反正我是看的不大明白。


其中,研究以前的项目代码发现,如果直接使用%c的话会输出类的全名(如com.xujingshi.dao.UserDao.list_PageHelper),这样一般会让日志可读性变差,如果这么写:%c{3\},仅仅输出dao.UserDao.list_PageHelper 是不是更好一些呢。


参考网址:

http://blog.csdn.net/wangjian5748/article/details/23824

http://www.journaldev.com/7128/log4j2-example-tutorial-configuration-levels-appenders

http://blog.csdn.net/hu_shengyang/article/details/6754031#


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值