您的位置:首页 > 其它

log4j+slf4j日志按日期生成

2017-01-04 17:03 253 查看
log4j2.xml的配置如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 配置日志输出文件名字 追加读写 ${sys:catalina.home}获取tomcat根目录-->
<RollingFile name="jymf.app" fileName="${sys:catalina.home}/logs/manager/jymf.app.log" filePattern="${sys:catalina.home}/logs/manager/jymf.app.%d{yyyy-MM-dd-HH-mm}.log" append="true">
<!-- 输出格式 -->
<PatternLayout pattern="[%l] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/>
<!-- 设置策略 -->
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<!-- 显示除error以外的所有日志 -->
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!-- 配置日志输出文件名字 追加读写 -->
<RollingFile name="jymf.app.error" fileName="${sys:catalina.home}/logs/manager/jymf.app.error.log" filePattern="/usr/local/tomcat6-0/logs/manager/jymf.app.error.%d{yyyy-MM-dd-HH-mm}.log" append="true">
<!-- 输出格式 -->
<PatternLayout pattern="[%l] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/>
<!-- 设置策略 -->
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<!-- 只显示error级别的日志 -->
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!-- 标准输出 -->
<Console name="STDOUT" target="SYSTEM_OUT">
<!-- 输出格式 -->
<!-- <PatternLayout pattern="[%l] [%t] [%-4r] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/> -->
<PatternLayout pattern="[%l] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%p] \: %m%n"/>
</Console>
</Appenders>
<Loggers>
<!-- project default level -->
<logger name="org.jymf" level="DEBUG" />
<!--log4jdbc -->
<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="org.jymf.dao" level="DEBUG"/>
<logger name="org.spring" level="ERROR" additivity="false">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="jymf.app" />
</logger>
<logger name="org.springframework" level="ERROR" additivity="false">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="jymf.app.error" />
</logger>
<!-- org.mybatis.spring* 的日志级别设置为error -->
<logger name="org.mybatis.spring" level="ERROR" additivity="false">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="jymf.app.error" />
</logger>
<!-- 配置记录器级别 -->
<Root level="DEBUG">
<AppenderRef ref="jymf.app"/>
<AppenderRef ref="jymf.app.error"/>
<!-- 输出设置 -->
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
所需jar包

log4j-api-2.2.jar

log4j-core-2.2.jar

log4j-jcl-2.2.jar

log4j-slf4j-impl-2.2.jar

日志按日期生成的测试类

package org.jymf.web;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogTest extends Thread{
public static Logger logger = LogManager.getLogger(LogTest.class.getName());
public void run(){
while(true){
try {
Thread.sleep(2000);
logger.error("Did it again!");   //error级别的信息,参数就是你输出的信息
logger.info("我是info信息");    //info级别的信息
logger.debug("我是debug信息");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package org.jymf.web;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test extends Thread{
public static Logger logger = LogManager.getLogger(Test.class.getName());
public void run(){
while(true){
try {
Thread.sleep(2000);
logger.error("Did it again!");   //error级别的信息,参数就是你输出的信息
logger.info("我是info信息");    //info级别的信息
logger.debug("我是debug信息");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package org.jymf.web;
public class TestSlf4j {
public static void main(String[] args){
Test t1 = new Test();
LogTest t2 = new LogTest();
t1.start();
t2.start();
}
}
日志级别:

log4j规定了默认的几个日记级别:trace<debug<info<warn<error<fatal等。下面说明一下:

级别之间是包含关系,也就是说,如果你把日志级别设置成了trace级别,那么所有大于这个级别的日志都会输出出来

1、trace:是追踪,就是程序推进一下,你就可以写个trace输出,所以trace应该会特别的多,不过我们可以设置更高的日志级别不让他输出。

2、debug:指出细粒度信息时间对调试应用程序非常有帮助,就是输出debug的信息

3、info:表示消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息

4、warn:表示会出现潜在的错误情况,其实就是警告信息

5、error:指虽然发生错误时间,但是仍然不影响系统的继续运行,就是显示错误信息

6、fatal:之处每个严重的错误时间都会导致应用程序的退出

7、all:是最低等级的,用于打开所有日志记录

8、off:是最高等级的,用于关闭所有日志记录。

 先简单介绍一下下面这个配置文件。

  1)根节点configuration,然后有两个子节点:appenders和loggers(都是复数,意思就是可以定义很多个appender和logger了)(如果想详细的看一下这个xml的结构,可以去jar包下面去找xsd文件和dtd文件)

  2)appenders:这个下面定义的是各个appender,就是输出了,有好多类别,这里也不多说(容易造成理解和解释上的压力,一开始也未必能听懂,等于白讲),先看这个例子,只有一个Console,这些节点可不是随便命名的,Console就是输出控制台的意思。然后就针对这个输出设置一些属性,这里设置了PatternLayout就是输出格式了,基本上是前面时间,线程,级别,logger名称,log信息等,差不多,可以自己去查他们的语法规则。

  3)loggers下面会定义许多个logger,这些logger通过name进行区分,来对不同的logger配置不同的输出,方法是通过引用上面定义的logger,注意,appender-ref引用的值是上面每个appender的name,而不是节点名称。

  这个例子为了说明什么呢?我们要说说这个logger的name(名称)了(前面有提到)。

  7. name的机制:(可以参考: http://logging.apache.org/log4j/2.x/manual/architecture.html)

   我们这里看到了配置文件里面是name很重要,没错,这个name可不能随便起(其实可以随便起)。这个机制意思很简单。就是类似于Java package一样,比如我们的一个包:cn.lsw.base.log4j2。而且,可以发现我们前面生成Logger对象的时候,命名都是通过
Hello.class.getName(); 这样的方法,为什么要这样呢? 很简单,因为有所谓的Logger 继承的问题。比如 如果你给cn.lsw.base定义了一个logger,那么他也适用于cn.lsw.base.lgo4j2这个logger。名称的继承是通过点(.)分隔的。然后你可以猜测上面loggers里面有一个子节点不是logger而是root,而且这个root没有name属性。这个root相当于根节点。你所有的logger都适用与这个logger,所以,即使你在很多类里面通过  类名.class.getName()
 得到很多的logger,而且没有在配置文件的loggers下面做配置,他们也都能够输出,因为他们都继承了root的log配置。

  我们上面的这个配置文件里面还定义了一个logger,他的名称是 cn.lsw.base.log4j2.Hello ,这个名称其实就是通过前面的Hello.class.getName(); 得到的,我们为了给他单独做配置,这里就生成对于这个类的logger,上面的配置基本的意思是只有cn.lsw.base.log4j2.Hello 这个logger输出trace信息,也就是他的日志级别是trace,其他的logger则继承root的日志配置,日志级别是error,只能打印出ERROR及以上级别的日志。如果这里logger
的name属性改成cn.lsw.base,则这个包下面的所有logger都会继承这个log配置(这里的包是log4j的logger name的“包”的含义,不是Java的包,你非要给Hello生成一个名称为“myhello”的logger,他也就没法继承cn.lsw.base这个配置了。

这里定义了三个appender,Console,File,RollingFile,看意思基本也明白,第二个是写入文件,第三个是“循环”的日志文件,意思是日志文件大于阀值的时候,就开始写一个新的日志文件。

  这里我们的配置文件里面的注释算比较详细的了。所以就大家自己看了。有一个比较有意思的是ThresholdFilter ,一个过滤器,其实每个appender可以定义很多个filter,这个功能很有用。如果你要选择控制台只能输出ERROR以上的类别,你就用ThresholdFilter,把level设置成ERROR,onMatch="ACCEPT" onMismatch="DENY" 的意思是匹配就接受,否则直接拒绝,当然有其他选择了,比如交给其他的过滤器去处理了之类的,详情大家自己去琢磨吧。

  为什么要加一个这样的配置文件呢?其实这个配置文件我感觉挺好的,他的实用性就在下面:

  8. 一个实用的配置文件:

  我们用日志一方面是为了记录程序运行的信息,在出错的时候排查之类的,有时候调试的时候也喜欢用日志。所以,日志如果记录的很乱的话,看起来也不方便。所以我可能有下面一些需求:

  1)我正在调试某个类,所以,我不想让其他的类或者包的日志输出,否则会很多内容,所以,你可以修改上面root的级别为最高(或者谨慎起见就用ERROR),然后,加一个针对该类的logger配置,比如第一个配置文件中的设置,把他的level设置trace或者debug之类的,然后我们给一个appender-ref是定义的File那个appender(共三个appender,还记得吗),这个appender的好处是有一个append为false的属性,这样,每次运行都会清空上次的日志,这样就不会因为一直在调试而增加这个文件的内容,查起来也方便,这个和输出到控制台就一个效果了。

  2)我已经基本上部署好程序了,然后我要长时间运行了。我需要记录下面几种日志,第一,控制台输出所有的error级别以上的信息。第二,我要有一个文件输出是所有的debug或者info以上的信息,类似做程序记录什么的。第三,我要单独为ERROR以上的信息输出到单独的文件,如果出了错,只查这个配置文件就好了,不会去处理太多的日志,看起来头都大了。怎么做呢,很简单。

  >首先,在appenders下面加一个Console类型的appender,通过加一个ThresholdFilter设置level为error。(直接在配置文件的Console这个appender中修改)

  >其次,增加一个File类型的appender(也可以是RollingFile或者其他文件输出类型),然后通过设置ThresholdFilter的level为error,设置成File好在,你的error日志应该不会那么多,不需要有多个error级别日志文件的存在,否则你的程序基本上可以重写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: