小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Maven依赖
在Spring boot中,只要引入如下依赖即可,可以按需使用相应的版本,推荐使用如下版本。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!-- SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<!-- Logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
application.properties 配置
#应用名
config.app.name=log-test
#日志目录 (生产环境推荐使用绝对路径 如/home/admin/logs)
config.app.log.dir=logs
#单个日志文件大小
config.app.log.file.max-size=200MB
#日志保留时间(天)
config.app.log.max-history=30
在项目的logback-spring.xml配置文件中引用yml中的变量.这样在package项目的时候,会根据启用不同的配置文件而读取上面定义好的日志输出地址
logback-spring.xml(推荐)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 打开定时扫描新的配置信息,60s一次,开启log本身的debug日志,该日志量小,对性能影响很小 -->
<configuration scan="true" scanPeriod="5 seconds" debug="true">
<!-- 配置参数 应用名 日志目录 单个日志文件最大大小 最长保留周期 -->
<springProperty scope="SYSTEM" name="APP_NAME" source="config.app.name" defaultValue="dx"/>
<springProperty scope="SYSTEM" name="LOG_HOME" source="config.app.log.dir" defaultValue="logs"/>
<springProperty scope="SYSTEM" name="FILE_MAX_SIZE" source="config.app.log.file.max-size" defaultValue="200MB"/>
<springProperty scope="SYSTEM" name="FILE_MAX_HISTORY" source="config.app.log.max-history" defaultValue="30"/>
<!-- std控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d|%5p|${PID}|%t|%-40.40logger{39} %M %L| %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
</filter>
</appender>
<!-- 所有文件日志 appender -->
<appender name="APP-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${APP_NAME}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}-%i.log.gz</FileNamePattern>
<maxHistory>${FILE_MAX_HISTORY}</maxHistory>
<maxFileSize>${FILE_MAX_SIZE}</maxFileSize>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%d|%5p|${PID}|%t|%-40.40logger{39} %M %L| %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 接受DEBUG以上级别日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
</filter>
</appender>
<!-- request appender -->
<appender name="requestLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/request.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/requst.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<maxHistory>${FILE_MAX_HISTORY}</maxHistory>
<maxFileSize>${FILE_MAX_SIZE}</maxFileSize>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 仅接受INFO级别日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 根据实际情况设置不同框架、sdk等的日志级别,有利于排查问题 -->
<logger name="com.dingxianginc" level="ERROR" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="APP-LOG"/>
</logger>
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="APP-LOG"/>
</logger>
<logger name="org.apache.ibatis" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="APP-LOG"/>
</logger>
<!-- 日志级别必须与requestLogAppender相匹配 -->
<logger name="requestLogger" level="INFO" additivity="false">
<!-- 必须引用接口日志requestLogAppender -->
<appender-ref ref="requestLogAppender"/>
</logger>
<root>
<!-- 修改level的值可以动态调整日志级别 -->
<level value="DEBUG"/>
<appender-ref ref="APP-LOG"/>
<!--在ideal中测试时打开注释,上线部署时应该关闭-->
<!--<appender-ref ref="STDOUT"/>-->
</root>
</configuration>
Java代码中获取日志记录变量
一般日志推荐使用@Slf4j定义Logger日志变量,或者使用LoggerFactory.getLogger获得Logger日志变量
日志记录代码demo
@Slf4j
public class LogPrinter implements Runnable {
//或者使用这个语句
//private static final Logger log = LoggerFactory.getLogger(LogPrinter.class);
@Override
public void run() {
if(log.isDebugEnabled()){
log.debug("输出DEBUG日志,参数示例, id=[{}], name=[{}]", 1,"张三");
}
if(log.isInfoEnabled()){
log.info("输出INFO日志,参数示例, id:[{}], name:[{}], 耗时:[{}]ms", 1,"张三", 7);
}
if(log.isWarnEnabled()){
log.warn("输出WARN日志,参数示例, id:[{}], name:[{}], 耗时:[{}]ms, 耗时超过了常规时间", 1,"张三", 200);
}
if(log.isErrorEnabled()){
log.error("输出ERROR日志,参数示例, id:[{}], name:[{}], 异常信息:", 1,"张三", 7, new IllegalArgumentException("参数不合法"));
}
}
}