1. 简单配置
如果只是简单的记录日志,想把日志记录到文件中,在application.properties
中简单配置
# 设置整个项目的代码调试级别是debug
logging.level.top.jarvaniv=debug
logging.file.name=D:/project/forum/NowCoderBBS/log/community.log
top.jarvaniv
是我项目的包名。
第一个配置:项目日志中显示debug以上级别的日志。
第二个配置:日志文件的路径和文件名。详情看这篇博客:日志loggin.file过时问题
额外科普:日志级别
2. 详细配置
项目开发中,日志不会都存放在同一文件中,需要按照日志级别等分类,单个日志文件不能过大,这些都可以通过配置文件自定义。
SpringBoot项目中创建logback-spring.xml
文件,放在项目的resources
目录下,SpringBoot就会自动识别并且应用。这个是约定,不用这个文件名不会被识别。
模板代码:
不懂的地方在代码里有注释
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>NowCoderBBS</contextName> <!-- 项目名 -->
<property name="LOG_PATH" value="D:/project/forum/NowCoderBBS"/> <!-- 日志存放目录 -->
<property name="APPDIR" value="log"/> <!-- 项目目录,日志存放目录可能存放多个项目 -->
<!-- error file 配置error级别相关的日志 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_error.log</file> <!-- error日志目录路径+日志文件名 -->
<!-- 文件存放策略,如果一个文件存放不下,怎么创建新的文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件的命名方式:%d:日期,日期格式;%i是变量,1、2、3等-->
<fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize> <!-- 单个日志文件大小上限,大小到5MB后创建新日志文件存储 -->
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory> <!-- 日志文件最多存储多久,单位:天 -->
</rollingPolicy>
<append>true</append> <!-- 以追加的方式存储,而不是覆盖 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 日志记录格式:日期 级别 哪个线程 哪个类 哪个文件 哪一行 具体日期信息 换行 -->
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset> <!-- 编码方式 -->
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤器 -->
<level>error</level> <!-- 筛选error级别的日志 -->
<onMatch>ACCEPT</onMatch> <!-- 是这个级别的就记录 -->
<onMismatch>DENY</onMismatch> <!-- 不是这个级别的拒绝记录 -->
</filter>
</appender>
<!-- 各个级别的配置方式大同小异,注释参考error -->
<!-- warn file -->
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info file -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${APPDIR}/log_info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- console 控制台:日志打印到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志输出格式:日期 日志级别 线程 类 [文件名:哪行] -->
<pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 过滤器 -->
<level>debug</level> <!-- 允许打印debug以上级别的日志 -->
</filter>
</appender>
<logger name="com.nowcoder.community" level="debug"/> <!-- 单独声明哪个包下的日志是什么级别 -->
<root level="info"> <!-- 所有项目根目录的级别是info-->
<!-- 最后,启用这些日志配置 -->
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
注意:配置文件中只配置了info
、warn
和error
级别的日志,没有配置debug
级别的日志,所以一会测试不会生成debug的日志文件。
测试
测试代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class LoggerTest {
// 通过日志工厂实例化日志对象,参数通常就是当前类
public static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
@Test
public void test01() {
System.out.println(logger.getName()); // 打印日志对象名字
logger.debug("debug log"); // 输出debug日志
logger.info("info log"); // 输出info日志
logger.warn("warn log"); // 输出warn日志
logger.error("error log"); // 输出error日志
}
}
运行结果
打印出日志对象名,三种日志类型
日志文件
配置文件中没有配置debug
相关的日志处理,果然没有生成debug级别的日志文件。
因为日志文件比较小没有超过5MB,没有分离创建新的日志文件,所以使用默认命名,而不是指定的日志文件名格式。
日志内容按照级别分类