log4j+slf4j日志按日期生成

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级别日志文件的存在,否则你的程序基本上可以重写了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fjkxyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值