所谓日志,能够描述系统运行状态的所有事件都可以称作为日志。所谓日志框架就是一套能实现日志输出的工具包,并且可以根据需求携带上下文定制输出格式、定制输出目标、运行时选择性输出、可灵活配置等等。
在Java开发中,常用的日志记录框架有 JUL、JCL、Log4J、SLF4J、LogBack。这些日志记录框架各有各的特点,各有各的应用场景。
优秀的日志框架肯定是一个日志门面加上一个日志实现:
常见的日志门面:JCL,SLF4J
常见的日志实现:Log4J,JUL,Logback
(SLF4J,Log4j,Logback 的作者都是同一个人)
jul:JDK自带的log框架
使用起来也很简单,我们的主角并不是JUL,所以简单介绍一下用法:
public class JDKLogDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger(JDKLogDemo.class.getName());
logger.info("info");
logger.warning("warning");
}
}
jul 的优点是使用起来非常简单,直接在JDK当中就能用,但是实现过于简陋,拓展性差,很少使用。
Logback log获取
获得 logger ,注意是当前类的class
private final Logger logger = LoggerFactory.getLogger(LogbackDemo.class);
但是每个类都得写这么一行很麻烦,我们还有注解的解决方法,打上lombok 的注解
@Slf4j
这样一来 直接 使用 log 就可以了。
Logback 配置
需求是 天滚动,按照 info 和 error 分别输出
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 控制台日志输出 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n
</pattern>
</layout>
</appender>
<!--info 日志配置-->
<!-- 因为每天都要输出,所以是一个滚动输出,所以是RollingFileAppender -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--配置过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--如果命中 error 则禁止输出-->
<onMatch>DENY</onMatch>
<!--反之不是 error 则输出log-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n
</pattern>
</encoder>
<!--滚动策略 按照时间来滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径 路径直接加上时间 %d -->
<fileNamePattern>/Users/chenhao/Work/log/info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--error 日志配置-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--配置过滤器-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/Users/chenhao/Work/log/error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--配置好上面的配置后,指定在root info级别下只用此配置-->
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>