log4j2使用

1. Log4j2的导入

        

        首先到http://logging.apache.org/log4j/2.x/download.html 上下载最新的log4j2的jar包,然后再eclipse中加入log4j-api-2.0-beta2.jar和log4j-core-2.0- beta2.jar,需要注意的是不要将所有jar都导入工程造成不必要的混乱。


2. 测试用例

      log4j 2.0的使用非常简单,只要用LogManager的getLogger函数获取一个logger,就可以使用logger记录日志,代码如下:


  1. import org.apache.logging.log4j.LogManager;  
  2. import org.apache.logging.log4j.Logger;  
  3.   
  4. public class HelloLog4j {  
  5.     private static Logger logger = LogManager.getLogger("HelloLog4j");  
  6.     public static void main(String[] args) {  
  7.         MyApplication myApplication =  new MyApplication();  
  8.           
  9.         logger.entry();  
  10.         logger.info("Hello, World!");   
  11.         myApplication.doIt();  
  12.         logger.error("Hello, World!");  
  13.         logger.exit();  
  14.     }  
  15. }  

 

  1. import org.apache.logging.log4j.LogManager;  
  2. import org.apache.logging.log4j.Logger;  
  3.   
  4.   
  5. public class MyApplication {  
  6.     static Logger logger = LogManager.getLogger(MyApplication.class.getName());    
  7.       
  8.     public boolean doIt() {    
  9.       logger.entry();   //Log entry to a method    
  10.       logger.error("Did it again!");   //Log a message object with the ERROR level    
  11.       logger.exit();    //Log exit from a method     
  12.       return false;    
  13.     }    
  14. }  


运行程序,输出结果为:

  1. 16:10:28.672 [main] ERROR MyApplication - Did it again!  
  2. 16:10:28.672 [main] ERROR HelloLog4j - Hello, World!  


注意到,输出的log都是在ERROR level上的,log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。从我们实验的结果可以看出,log4j默认的优先级为ERROR或者WARN(实际上是ERROR)。



3. 配置文件

          log4j是apache的一个开源项目,在写这篇博客的时候已经发布了2.0的beta版本,首先需要注意的是,log4j 2.0与以往的1.x有一个明显的不同,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件的优先级如下:(classpath为scr文件夹)

  1. classpath下名为 log4j-test.json 或者log4j-test.jsn文件
  2. classpath下名为 log4j2-test.xml
  3. classpath下名为 log4j.json 或者log4j.jsn文件
  4. classpath下名为 log4j2.xml
        必须注意.xml 文件的文件名为log4j2,这里让我纠结了一个下午,系统一直找不到配置文件,最后发现是文件名里面少了一个2。下面以log4j2.xml为例来介绍log4j的配置。

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration status="OFF">  
  3.   <appenders>  
  4.     <Console name="Console" target="SYSTEM_OUT">  
  5.       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>  
  6.     </Console>  
  7.   </appenders>  
  8.   <loggers>  
  9.     <root level="trace">  
  10.       <appender-ref ref="Console"/>  
  11.     </root>  
  12.   </loggers>  
  13. </configuration>  

         
         首先介绍loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log。
         root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式。例如以下定义:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <configuration status="OFF">  
  3.   <appenders>  
  4.     <Console name="Console" target="SYSTEM_OUT">  
  5.       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>  
  6.     </Console>  
  7.   </appenders>  
  8.   <loggers>  
  9.     <logger name="com.relin.HelloLog4j" level="error" additivity="false">  
  10.       <appender-ref ref="Console"/>  
  11.     </logger>  
  12.     <root level="trace">  
  13.       <appender-ref ref="Console"/>  
  14.     </root>  
  15.   </loggers>  
  16. </configuration>  

此时,HelloLog4j则会在error级别上输出log,而其他类则会在trace级别上输出log。需要注意的是 additivity选项,如果设置为true(默认值)则HelloLog4j的log会被打印两次,第二次打印是由于HelloLog4j同时也满足root里面定义的trace

4. 其他特征


  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <configuration status="error">    
  3.   <appenders>    
  4.     <Console name="Console" target="SYSTEM_OUT">    
  5.       <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>    
  6.       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>    
  7.     </Console>    
  8.     <File name="log" fileName="target/test.log" append="false">    
  9.       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>    
  10.     </File>    
  11.     <RollingFile name="RollingFile" fileName="logs/app.log"    
  12.                  filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">    
  13.       <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>    
  14.       <SizeBasedTriggeringPolicy size="500 MB" />    
  15.     </RollingFile>    
  16.   </appenders>    
  17.   <loggers>    
  18.     <root level="trace">    
  19.       <appender-ref ref="RollingFile"/>    
  20.       <appender-ref ref="Console"/>    
  21.     </root>    
  22.   </loggers>    
  23. </configuration>   

扩展组件

1,ConsoleAppender

输出结果到System.out或是System.err。

2,FileAppender

输出结果到指定文件,同时可以指定输出数据的格式。append=“false”指定不追加到文件末尾

3,RollingFileAppender

自动追加日志信息到文件中,直至文件达到预定的大小,然后自动重新生成另外一个文件来记录之后的日志。


介绍下RollingRandomessFile  的相关属性:
  name:表示该appender的名称
 fileName:表示输出的文件的路径
 append:是否追加,true表示追加内容到所在的日志,false表示每次都覆盖
  filePattern:表示当日志到达指定的大小或者时间,产生新日志时,旧日志的命名路径。
 PatternLayout:和log4j1一样,指定输出日志的格式,具体代表的意思见前面的博客中
 Policies:策略,表示日志什么时候应该产生新日志,可以有时间策略和大小策略等,上面使用的是时间策略,每隔24小时产生新的日志文件
 ThresholdFilter:过滤器,log4j2中有很多的filter,但是没有仔细研究,需要的时候再看上文中的ThresholdFilter  filter指定了输出的最低级别,如 将输 出debug以及debug级别以上的,但是需求只需要输出debug级别的,所以加上下列filter但是,这样的效果是输出debug和info两个级别的日志,所以换下两个filter的顺序就好了。


过滤标签

1,ThresholdFilter

用来过滤指定优先级的事件。

2,TimeFilter

设置start和end,来指定接收日志信息的时间区间。


按天存储日志文件配置方法

<configuration status="OFF">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingFile name="ROLLING"  fileName = "d:/logs/howsun.log"
             filePattern = "d:/logs/howsun_%d{yyyy-MM-dd}_%i.log">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="24"/>
                <SizeBasedTriggeringPolicy size="51200 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
</appenders>
<loggers>
<root level="debug">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING"/>
</root>
</loggers>
</configuration>

自定义日志配置文件路径

public void init() throws ServletException {
  String configRoot = this.getInitParameter("configRoot");
  String log4j2Config = configRoot + File.separator + this.getInitParameter("log4j2Config");
  File file = new File(log4j2Config);
  try {
    LoggerContext context =(LoggerContext)LogManager.getContext(false);
    context.setConfigLocation(file.toURI());
    
    //重新初始化Log4j2的配置上下文
    context.reconfigure();
  } catch (MalformedURLException e) {
    e.printStackTrace();
  }
  
  //todo: 这里拿到的logger,已经是按新配置文件初始化的了
  logger = LogManager.getLogger(DefaultInitServlet.class);
}

相应的,只要在web.xml配置这个InitServlet,并提供configRoot和log4j2Config两个路径即可(也可以不要配置configRoot,而是通过System.getProperty("user.dir")来获取应用的运行目录,对tomcat而言,这个目录就是tomcat/bin,其他如命令行的应用,就是bat/sh的所在目录)

web.xml

引用

<servlet>

<servlet-name>InitServlet</servlet-name>

<servlet-class>test.InitServlet</servlet-class>

<load-on-startup>0</load-on-startup>

<init-param>

<!-- 配置文件根目录 -->

<param-name>configRoot</param-name>

<param-value>d://config</param-value>

</init-param>

<init-param>

<!-- log4j2配置文件相对路径  -->

<param-name>log4j2Config</param-name>

<param-value>log4j2/log4j2.xml</param-value>

</init-param>

</servlet>


不同级别日志输出到不同日志文件

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="off" monitorInterval="1800">
  <Properties>
    <Property name="log-path">d://logs</Property>
  </Properties>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36}.%M()/%L  - %msg%xEx%n"/>
    </Console>

    <File name="app_debug" fileName="${log-path}/app/debug.log" append="false">
      <Filters>
        <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
      </Filters>
      <PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss z} %-5level %class{36}.%M()/%L - %msg%xEx%n"/>
    </File>
    <File name="app_info" fileName="${log-path}/app/info.log" append="false">
      <Filters>
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>

      <PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss z} %-5level %class{36}.%M()/%L - %msg%xEx%n"/>
    </File>
    <File name="app_error" fileName="${log-path}/app/error.log" append="false">
      <Filters>
        <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
      <PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss z} %-5level %class{36}.%M()/%L - %msg%xEx%n"/>
    </File>
  </Appenders>
  <Loggers>
    <Logger name="com.test.app" level="trace" additivity="false">
      <appender-ref ref="Console"/>
      <appender-ref ref="app_debug"/>
      <appender-ref ref="app_info"/>
      <appender-ref ref="app_error"/>
    </Logger>
  </Loggers>
</configuration>

主要是要理解ThresholdFilter的onMatch/onMismatch的三个选项值:ACCEPT/DENY/NEUTRAL,其实,根据字面意思,也很好理解。

重要的是,如果有多个ThresholdFilter,那么Filters是必须的,同时在Filters中,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能搞颠倒。



log4j2指定日志文件路径到工程路径

http://logging.apache.org/log4j/2.x/manual/lookups.html

System Properties Lookup

As it is quite common to define values inside and outside the application by using System Properties, it is only natural that they should be accessible via a Lookup. As system properties are often defined outside the application it would be quite common to see something like:

   
   
  1. <Appenders>
  2. <File name="ApplicationLog" fileName="${sys:logPath}/app.log"/>
  3. </Appenders>

2、直接随web项目路径:

Web Lookup

The WebLookup allows applications to retrieve variables that are associated with the ServletContext. In addition to being able to retrieve various fields in the ServletContext, WebLookup supports looking up values stored as attributes or configured as initialization parameters. The following table lists various keys that can be retrieved:

Key Description
attr.name Returns the ServletContext attribute with the specified name
contextPath The context path of the web application
effectiveMajorVersion Gets the major version of the Servlet specification that the application represented by this ServletContext is based on.
effectiveMinorVersion Gets the minor version of the Servlet specification that the application represented by this ServletContext is based on.
initParam.name Returns the ServletContext initialization parameter with the specified name
majorVersion Returns the major version of the Servlet API that this servlet container supports.
minorVersion Returns the minor version of the Servlet API that this servlet container supports.
rootDir Returns the result of calling getRealPath with a value of "/".
serverInfo Returns the name and version of the servlet container on which the servlet is running.
servletContextName Returns the name of the web application as defined in the display-name element of the deployment descriptor

Any other key names specified will first be checked to see if a ServletContext attribute exists with that name and then will be checked to see if an initialization parameter of that name exists. If the key is located then the corresponding value will be returned.

    
    
  1. <Appenders>
  2. <File name="ApplicationLog" fileName="${web:rootDir}/app.log"/>
  3. </Appenders>


转:http://blog.csdn.net/lrenjundk/article/details/8178875

转:http://blog.163.com/m15876524871_1/blog/static/196818147201410652443288/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值