logback
1.性能比log4j要好
2.配置获取顺序
logback在启动的时候,会按照下面的顺序加载配置文件
1.如果java程序启动时指定了logback.configurationFile属性,就用该属性指定的配置文件。如java -Dlogback.configurationFile=/path/to/mylogback.xml Test ,这样执行Test类的时候就会加载/path/to/mylogback.xml配置
2.在classpath中查找 logback.groovy 文件
3.在classpath中查找 logback-test.xml 文件
4.在classpath中查找 logback.xml 文件
3.logger以及root节点
root节点和logger节点其实都是表示Logger组件。个人觉的可以把他们之间的关系可以理解为父子关系,root是最顶层的logger,正常情况getLogger("name/class")没有找到对应logger的情况下,都是使用root节点配置的logger。
如果配置了logger,并且通过getLogger("name/class")获取到这个logger,输出日志的时候,就会使用这个logger配置的appender输出,同时还会使用rootLogger配置的appender。我们可以使用logger节点的additivity="false"属性来屏蔽rootLogger的appender。这样就可以不使用rootLogger的appender输出日志了。
关于logger的获取,一般logger是配置name的。我们再代码中经常通过指定的CLass来获取Logger,比如这样LoggerFactory.getLogger(Test.class);,其实这个最后也是转成对应的包名+类名的字符串com.kongtrio.Test.class。假设有一个logger配置的那么是com.kongtrio,那么通过LoggerFactory.getLogger(Test.class)获取到的logger就是这个logger。
4.具体配置demo(单独某个或者某些class生成日志文件)
<?xml version="1.0" encoding="UTF-8"?>
<!--configuration节点相关属性-->
<!--debug false 要不要打印 logback内部日志信息,true则表示要打印。建议开启-->
<!--scan true 配置发送改变时,要不要重新加载-->
<!--scanPeriod 1 seconds 检测配置发生变化的时间间隔。如果没给出时间单位,默认时间单位是毫秒-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--configuration子节点介绍-->
<!--contextName节点 设置日志上下文名称,后面输出格式中可以通过定义 %contextName 来打印日志上下文名称-->
<!--property节点 用来设置相关变量,通过key-value的方式配置,然后在后面的配置文件中通过 ${key}来访问-->
<!--appender节点 日志输出组件,主要负责日志的输出以及格式化日志。常用的属性有name和class-->
<!--name 无默认值 appender组件的名称,后面给logger指定appender使用-->
<!--class 无默认值 appender的具体实现类。常用的有 ConsoleAppender、FileAppender、RollingFileAppender-->
<!--ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。-->
<!--FileAppender:向文件输出日志内容的组件,用法也很简单,不过由于没有日志滚动策略,一般很少使用-->
<!--RollingFileAppender:向文件输出日志内容的组件,同时可以配置日志文件滚动策略,在日志达到一定条件后生成一个新的日志文件。-->
<contextName>bm</contextName>
<property name="log.path" value="log" />
<property name="log.maxHistory" value="15" />
<property name="log.colorPattern" value="%d{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义文件滚动时的文件名的格式-->
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--15天的时间周期,日志量最大20GB-->
<!--<MaxHistory>${log.maxHistory}</MaxHistory>-->
<!--<totalSizeCap>20GB</totalSizeCap>-->
</rollingPolicy>
<encoder>
<!--定义控制台输出格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-在slf4j中,从小到大的日志级别依旧是trace、debug、info、warn、error -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--root是默认的logger 这里设定输出级别是debug-->
<root level="debug">
<appender-ref ref="console" />
</root>
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--单独某个或者某些class生成日志文件 结算日志文件-->
<appender name="SettlementDetailControllerAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/moneyCount/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--additivity 子Logger 是否继承 root的Logger 的 输出源(appender) 的标志位 如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<logger name="com.sunits.bm.settlement.controller.SettlementDetailController" level="${logging.level}" additivity="false">
<appender-ref ref="SettlementDetailControllerAppender" />
</logger>
5.方法内日志单独保存到相关文件
1.xml建立相关logger
<logger name="testlog" level="${logging.level}" additivity="false">
<appender-ref ref="SettlementDetailControllerAppender" />
</logger>
2.在相关方法或者类中中写上 Logger testlog = LoggerFactory.getLogger("testlog"); 然后开始使用即可