文章目录
- 前言
- 一、logback日志组件
- 1.日志等级
- 2.打印日志
- 二、配置
- 1.简单配置
- 2.扩展配置
- 3.代码测试
- 三、启动过程的错位
- 总结
前言
SpringBoot系列Demo代码,整合logback,设置输出日志。
一、logback日志组件
logback是一款开源日志组件,属于Log4j的升级版本,现在项目组使用的次数越来越多。
1.日志等级
日志级别有(从高到低):FATAL(致命),ERROR(错误),WARN(警告),INFO(信息),DEBUG(调试),TRACE(跟踪)或者 OFF(关闭),默认的日志配置在消息写入时将消息回显到控制台。默认情况下,将记录错误级别、警告级别和信息级别的消息。
2.打印日志
通过Class的方式初始化
private final static Logger LOGGER = LoggerFactory.getLogger(HelloLogback.class);
二、配置
1.简单配置
如果不需要进行复杂的日志配置,则在配置文件中进行简单的日志配置即可(默认情况下,SpringBoot日志只记录到控制台,不写日志文件)
#日志配置
logging:
level:
#日志级别 root表示所有包,也可以单独配置具体包 fatal error warn info debug trace off
root: info
file:
path: /local/log/dev
name: app.log
2.扩展配置
如果需要比较复杂的配置,建议使用扩展配置的方式,SpringBoot推荐我们使用带-spring后缀的 logback-spring.xml 扩展配置,因为默认的的logback.xml标准配置,Spring无法完全控制日志初始化。(spring扩展对springProfile节点的支持)
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:程序运行时配置文件被修改,是否重新加载。true=重新加载;false=不重新加载;默认为true; -->
<!-- scanPeriod:监测配置文件被修改的时间间隔,scan属性必须设置为true才可生效;默认为1分钟,默认单位是毫秒; -->
<!-- debug:是否打印logback程序运行的日志信息。true=打印;false=不打印;默认为false; -->
<configuration scan="true" scanPeriod="60" debug="false">
<!--日志文件主目录-->
<property name="LOG_HOME" value="/local/log/dev"/>
<!--日志格式-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X[%thread] %-5level %logger{50} %line - %msg%n"/>
<!--日志文件名称 spring.application.name表示工程名称-->
<property name="APP_NAME" value="app"/>
<!-- <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>-->
<!-- <!–默认配置–>-->
<!-- <include resource="org/springframework/boot/logging/logback/defaults.xml"/>-->
<!-- <!–配置控制台(Console)–>-->
<!-- <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>-->
<!-- 配置磁盘文件滚动输出日志 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--设置策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件路径:这里%d{yyyyMMdd}表示按天分类日志-->
<FileNamePattern>${LOG_HOME}/%d{yyyyMMdd}/${APP_NAME}.%i.log</FileNamePattern>
<!--设置日志保留天数-->
<MaxHistory>15</MaxHistory>
<!--设置最大日志大小-->
<MaxFileSize>14KB</MaxFileSize>
</rollingPolicy>
<!--设置日志输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<!--此日志文件只记录 【debug / info / warn / error】 级别的-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>【debug / info / warn / error】</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
</appender>
<!--控制台输出日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 设置日志输出格式 -->
<pattern>${pattern}</pattern>
<!-- 设置输出字符集编码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- <root level="INFO">-->
<!-- <appender-ref ref="FILE"/>-->
<!-- <!–为了直观,在控制天中也输出info级别的日志–>-->
<!-- <appender-ref ref="CONSOLE"/>-->
<!-- </root>-->
<!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
<appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE"/>
</appender>
<!--多环境配置 按照active profile选择分支-->
<springProfile name="dev">
<!--root节点 全局日志级别,用来指定最基础的日志输出级别-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC-FILE"/>
</root>
<!-- 子节点向上级传递 局部日志级别-->
<!-- <logger level="WARN" name="org.springframework"/>-->
<!-- <logger level="WARN" name="com.netflix"/>-->
<!-- <logger level="DEBUG" name="org.hibernate.SQL"/>-->
</springProfile>
<springProfile name="prod">
<root level="INFO">
<!--生产环境,可以不需要再控制台输出日志-->
<!--<appender-ref ref="CONSOLE"/>-->
</root>
</springProfile>
</configuration>
springProfile节点设置,application.yml
spring:
profiles:
active: dev
3.代码测试
启动项目,调用接口,查看日志文件输出
三、启动过程的错位
在项目启动时,出现如下错误:
发现时MaxFileSize出现错误,排查后发现是配置文件中错误:
TimeBasedRollingPolicy中并没有MaxFileSize属性,于是修改为SizeAndTimeBasedRollingPolicy
启动正常,问题成功解决。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了日志根据时间和大小输出到文件的实现,后续还会完善。