文章目录
前言
日志 是程序运行过程中所打印出来的信息。
我们可以通过日志来实时了解程序运行的情况,在每一个时刻的各种情况。当出现问题时,可以快速的进行定位。
java程序员在学习java之后就会知道日志对于任何一个Java应用程序尤其是服务端程序是至关重要的。日志有很多的框架,如java.util.logging、Apache log4j、logback。
当我学习了springboot后,更加常用的就是SLF4J(Simple logging facade for Java)
SLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。
使用是比较简单的,下面也简单写了一下,但是xml的配置却是有点麻烦,我也来记录一下。也是本博客最重要的,也是我最想记录的。
一、Slf4j 日志使用
1. 老式用法
自己写日志的时候,肯定需要:
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
logger.debug("debug");//默认日志级别为info
logger.info("info");
logger.error("error");
logger.warn("warn");
每次写新的类,就需要重新写logger
2. @Sl4j注解
a. maven依赖
lombok 插件中,包含了对sl4j的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
b. 使用示例
- 在类上使用
@Sl4j
注解 进行标注 - 然后直接使用即可,如下:
/**
* Created with IntelliJ IDEA.
* User: 冯安晨.
* Date: 2018/1/8.
* Time: 下午 8:05.
* Explain:日志测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
/**
* 传统方式实现日志
*/
@Test
public void test1(){
logger.debug("debug");//默认日志级别为info
logger.info("info");
logger.error("error");
logger.warn("warn");
}
/**
* Slf4j注解方式实现日志
*/
@Test
public void test2(){
log.fatal("这是fatal信息");
log.error("这是error信息");
log.warn("这是warn信息");
log.info("这是info信息");//默认日志级别为info
log.debug("这是debug信息");
}
}
3. 注意
如果注解@Slf4j注入后找不到变量log,需要IDEA安装lombok插件,
File → settings → Plugins
二 、日志级别
级别 | 中文名称 | 级别等级 | 详解 |
---|---|---|---|
OFF | 关闭 | 1 | Level 是最高等级的,用于关闭所有日志记录。 |
FATAL | 致命的错误 | 2 | level 指出每个严重的错误事件将会导致应用程序的退出。 |
ERROR | 错误 | 3 | level 指出虽然发生错误事件,但仍然不影响系统的继续运行。 |
WARN | 警告 | 4 | level 表明会出现潜在错误的情形。 |
INFO | 信息 | 5 | level 表明 消息在粗粒度级别上突出强调应用程序的运行过程。 |
DEBUG | 调试 | 6 | Level 指出细粒度信息事件对调试应用程序是非常有帮助的。 |
TRACE | 7 | 与DEBUG 相比更细致化的记录事件消息。 | |
ALL | 8 | Level 是最低等级的,用于打开所有日志记录。 |
从高到地低
OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL
一般使用这5个:FATAL
、 ERROR
、 WARN
、 INFO
、 DEBUG
三、日志的xml文件配置
1. 直接拿走使用的xml配置
springboot项目可以直接拿走使用:
logback-spring.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<property name="APP_NAME" value="airport-objidentifytomq-s" />
<property name="LOG_DIR" value="/var/log/imoslog/airport-objidentifytomq-s" />
<property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger{80} [%file : %line] - %msg%n" />
<contextName>${APP_NAME}</contextName>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender" >
<!--输出格式,改成 encoder 报错--->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--<pattern>%d [%thread] %highlight(%-5level) %logger{36} %line - %msg%n</pattern>-->
<pattern>${ENCODER_PATTERN}</pattern>
</layout>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<file>/var/log/imoslog/airport-objidentifytomq-s/info.log</file>
<encoder>
<charset>utf-8</charset>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>40MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>5</maxHistory>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>/var/log/imoslog/airport-objidentifytomq-s/error.log</file>
<encoder>
<charset>utf-8</charset>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>40MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
2. xml配置的详解(一)
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!--property标签:设置属性值,为键值对。name为键,vale为值。可以通过${键}来取值,也就是vale的值 -->
<!-- 应用名称 -->
<property name="APP_NAME" value="logtest" />
<!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 -->
<property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />
<!-- 日志输出格式 -->
<!--
%d{yyyy-MM-dd HH:mm:ss.SSS} 时间格式 hh是12h制 HH是24h制
[%thread] 线程
%highlight(%-5level) 高亮级别
%logger{36} 日志包 36包长度
[%file : %line] 目标类 和 行数
%msg log信息
- 就是一个间隔符
%n 换行
(encoder必需的)-->
<property name="ENCODER_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger{80} %line - %msg%n" />
<contextName>${APP_NAME}</contextName>
<!-- 控制台日志:输出全部日志到控制台 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--原来是 layout , 改成 encoder 报错-->
<layout class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</Pattern>
</layout>
</appender>
<!-- 信息日志:输出全部日志到文件 -->
<appender name="fileInfoLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器:只输出此级别以上的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<!--正在记录的日志-->
<file>/var/log/imoslog/airport-objidentifytomq-s/info.log</file>
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>utf-8</charset>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<!--滚动策略:输出规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--归档的日志文件路径-->
<fileNamePattern>${LOG_DIR}/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--每个文件最大 10M -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>40MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--只保留五天的日志,5d周期-->
<maxHistory>5</maxHistory>
</rollingPolicy>
</appender>
<!-- 错误日志:用于将错误日志输出到独立文件 -->
<appender name="fileErrorLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!--正在记录的ERROR级别日志-->
<file>/var/log/imoslog/airport-objidentifytomq-s/error.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>utf-8</charset>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--归档的日志文件路径-->
<fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>40MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--只保留最近七天的日志-->
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<!-- 独立输出的同步日志 -->
<appender name="SYNC_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/sync.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<logger name="log.sync" level="DEBUG" addtivity="true">
<appender-ref ref="SYNC_FILE" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
<appender-ref ref="ERROR_FILE" />
</root>
<!--==================================指定包的日志======================================================-->
<!--这个logger没有指定appender,它会继承root节点中定义的那些appender -->
<logger name="com.sk" level="info">
<!-- <appender-ref ref="consoleLog"/>-->
</logger>
<!--通过 LoggerFactory.getLogger("Test3") 可以获取到这个logger
additivity="false" 没有它 输出双倍 自身的和继承的root的appender-->
<logger name="Test3" level="trace" additivity="false">
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</logger>
<!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
<!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
<!-- <logger name="Test3" level="trace" additivity="false"></logger>-->
</configuration>
3. xml配置的详解(二)
- appender元素
定义一个日志输出目的地。
name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
class [#REQUIRED attribute] : 定义appender对象所属的类的全名
param [* child] : 创建appender对象时传递给类构造方法的参数
layout [? child] : 该appender使用的layout对象
输出方式appender一般有5种:即appender中的 class属性值
org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
- layout元素
定义与某一个appender相联系的日志格式化器。
class [#REQUIRED attribute] : 定义layout对象所属的类的全名
param [* child] : 创建layout对象时传递给类构造方法的参数
- logger元素
定义一个日志输出器。
name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
level [? child] : 定义该logger的日志级别
appender-ref [* child] : 定义该logger的输出目的地
- root元素
定义根日志输出器root logger。
param [* child] : 创建root logger对象时传递给类构造方法的参数
level [? child] : 定义root logger的日志级别
appender-ref [* child] : 子标签。定义root logger的输出目的地