标题比较尴尬,log4j学习系列的最后一篇是放弃log4j - -!
一、 简介
log4j的作者提出了slf4j,简单日志门面,相当于是一套统一的java日志api,是个接口标准,编程时使用这个抽象层的接口标准,对接口编程,那么具体的日志实现部分就可以灵活的进行替换了——————例如,代码中使用slf4j编程,实现配置为log4j、也可以配置为logback 。
logback也是log4j作者开发的日志库,用于替换log4j,总之比log4j更好更强大。
于是,java日志的最佳实践就是: slf4j + logback
二、使用slf4j + logback
maven引入
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency>
src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?> <!--debug="true" : 打印logback内部状态(默认当logback运行出错时才会打印内部状态 ),配置该属性后打印条件如下(同时满足): 1、找到配置文件 2、配置文件是一个格式正确的xml文件 也可编程实现打印内部状态,例如: LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc); --> <!-- scan="true" : 自动扫描该配置文件,若有修改则重新加载该配置文件 --> <!-- scanPeriod="30 seconds" : 配置自动扫面时间间隔(单位可以是:milliseconds, seconds, minutes or hours,默认为:milliseconds), 默认为1分钟,scan="true"时该配置才会生效 --> <configuration debug="false" scan="true" scanPeriod="30 seconds" packagingData="true"> <!-- 设置 logger context 名称,一旦设置不可改变,默认为default --> <contextName>remote-server</contextName> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 当前活动日志文件名 --> <file>./rpc_demo_log.log</file> <!-- 文件滚动策略根据%d{patter}中的“patter”而定,此处为每天产生一个文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档文件名“.zip或.gz结尾”,表示归档文件自动压缩 --> <FileNamePattern>./rpc_demo_log%d{yyyyMMdd}.log.zip</FileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <!--rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>renhai%i.log</fileNamePattern> <minIndex>1</minIndex> <maxIndex>10</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>20MB</maxFileSize> </triggeringPolicy--> <!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> rollover daily <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern> each file should be at most 30MB, keep 60 days worth of history, but at most 20GB <maxFileSize>30MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> --> <encoder> <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread]%logger{36} - %msg%n</pattern> <!-- <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread] - %msg%n</pattern> --> </encoder> </appender> <!-- 日志级别若没显示定义,则继承最近的父logger(该logger需显示定义level,直到rootLogger)的日志级别--> <!-- logger的appender默认具有累加性(默认日志输出到当前logger的appender和所有祖先logger的appender中),可通过配置 “additivity”属性修改默认行为--> <!-- <logger name="com.yinz" level="debug" additivity="false" > <appender-ref ref="FILE"/> </logger> --> <!-- 至多只能配置一个root --> <root level="info"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
代码中使用举例
private Logger logger = LoggerFactory.getLogger(RpcServerApp.class);