虽然 Spring 全家桶直接编写 application.yml 就可以配置日志等级,
但是在后续脱离 spring 就需要另外采用其他日志配置, 一般就是采用 logback 来处理.
需要注意每个版本
logback或者日志实现可能变动很大, 所以在升级或者更换实现的时候要留意
这里先引入依赖第三方需求库:
<dependencies>
<!-- logback配置: 1.5.18版本 -->
<!-- 默认会引入: slf4j-api -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.18</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.5.18</version>
</dependency>
</dependencies>
之后就是在 src/main/resources 创建 logback.xml 配置,
而外部 jar 包启动加载配置稳健这可以采用以下启动配置:
# 启动的时候加载 logback.xml 配置
java -jar -Dlogging.config="/etc/fusion/websocket-logback.xml" test.jar
而其中需要知道日志等级涵盖有: OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE, 这里想设计个最基础的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan: 当此属性设置为true时, 配置文件如果发生改变将会被重新加载, 默认值为true -->
<!-- scanPeriod: 设置监测配置文件是否有修改的时间间隔, 如果没有给出时间单位默认单位是毫秒; 当scan为true时, 此属性生效. 默认的时间间隔为1分钟. -->
<!-- debug: 当此属性设置为true时, 将打印出logback实时logback运行状态. 默认值为false -->
<configuration scan="true" scanPeriod="120 seconds" debug="false">
<!-- 定义日志变量对象 Start -->
<!-- 日志应用名称 -->
<!-- 这里默认会去加载 FUSION_LOG_NAME 环境变量, 如果不存在就默认加载 fusion 字符串 -->
<property name="LOG_NAME" value="${FUSION_LOG_NAME:-fusion}"/>
<!-- 日志放置目录 -->
<!-- 这里默认会去加载 FUSION_LOG_DIR 环境变量, 如果不存在就默认加载 ./logs 目录 -->
<property name="LOG_DIR" value="${FUSION_LOG_DIR:-./logs}"/>
<!-- 日志文件编码 -->
<!-- 默认读取外部 FUSION_LOG_CHARSET 变量 -->
<property name="LOG_CHARSET" value="${FUSION_LOG_CHARSET:-UTF-8}"/>
<!-- 日志等级 -->
<!-- 默认读取外部 FUSION_LOG_LEVEL 变量 -->
<property name="LOG_LEVEL" value="${FUSION_LOG_LEVEL:-WARN}"/>
<!-- 定义日志变量对象 End -->
<!-- 定义处理日志控制器: 命令行输出 -->
<!-- name: 声明处理器名称 -->
<!-- class: 声明调用的处理句柄 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期, %thread表示线程名, %-5level:级别从左显示5个字符宽度, %msg:日志消息, %n是换行符-->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [${LOG_NAME}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>${LOG_CHARSET}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${LOG_LEVEL}</level>
</filter>
</appender>
<!-- 定义处理日志控制器: 文件写入 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤掉 INFO, TRACE 和 DEBUG 级别的日志, 屏蔽小于等于声明的等级的日志都会被屏蔽 -->
<!-- 如果要显示 INFO 日志就需要设置 level = DEBUG -->
<!-- 一般写入文件来说不需要 INFO 那些冗余信息, 有的第三方库会把某些关键信息写入在 INFO 所以还是屏蔽好点 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${LOG_LEVEL}</level>
</filter>
<!-- 默认日志文件名 -->
<file>${LOG_DIR}/${LOG_NAME}.log</file>
<!-- 日志压缩滚动配置, 用于当天变动的时候回滚压缩指定日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_DIR}/${LOG_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<!--日志文件最大的大小, 超过打小就自动日志回滚压缩-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
<!-- 格式化处理 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [${LOG_NAME}] [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>${LOG_CHARSET}</charset>
</encoder>
</appender>
<!-- 当然可以针对第三方包来单独处理 -->
<!-- io.vertx为java中的包, 默认拦截DEBUG信息切换用 CONSOLE 处理 -->
<!-- additivity = true, 如果上级也采用日志单元则会默认向上传递, 同时配置 appender-ref 则会被打印执行两次日志操作 -->
<!--
<logger name="io.vertx.core" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
-->
<!-- 这里可以简要配置下,让底层去自行处理 -->
<!--
<logger name="io.vertx.core" level="${LOG_LEVEL}" additivity="true"/>
-->
<!-- 不过最好还是写入到具体我们的配置 -->
<logger name="io.vertx.core" level="${LOG_LEVEL}" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<!-- 默认日志输出调用配置 -->
<!-- 日志等级等级: ERROR、WARN、INFO、DEBUG、TRACE -->
<!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="${LOG_LEVEL}">
<!-- appender-ref 代表调用哪个 appender 处理 -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
这里定义该有的日志等级配置, 如果想切换日志等级可以考虑直接环境变量切换即可.