以前做过的项目基本上都是打包成war文件后通过web容器来部署的,日志框架采用的是log4j。这种部署方式使得日志文件不需要格外的配置,直接会在指定的目录下生成。由于最近工作上不是很忙,突然心血来潮就准备用springboot重构之前的服务。等到项目重构完成的时候发现日志处理的不是太友好,经过一番试水之后整理成如下文档,希望可以帮助到需要的朋友。
springboot推荐的日志类库是slf4j、日志系统为logback。它的输出级别一共有ERROR、WARN、INFO、DEBUG ,TRACE五种。默认输出级别是INFO。
可通过配置文件中logging.level.root属性修改默认的输出级别 如:logging.level.root=debug
如需更改日志的路径及日志文件的名称可以分别设置logging.path及logging.file属性 如下图所示
通过这种方式,springboot应用程序在运行时就向D:/logs/report-service/report-service.log文件中输出了日志
上述配置方式在本地开发过程中是没有问题的,但是向测试环境或成产环境中部署的时候,有以下问题:
1.部署时需要在配置文件中手动指定日志文件输出路径。
2.当需要更改服务器中的日志存储路径需要手动更改配置文件中的路径。
3.当需要外部容器部署时由于日志没有输出到默认容器存放日志路径,来回切换目录给开发和运维人员都带来了极为的不便。
这里就拿外部容器中部署springboot应用为例:
首先在资源文件目录下创建一个名称为logback-spring.xml 的文件,文件中的具体类容为下
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true" >
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<property name="LOG_PATH" value="${catalina.base}/logs/"/>
<property name="LOG_FILE" value="report-service.log"/>
<!-- 定义控制台输出日志的格式 -->
<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} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--定义每天生成日志的格式-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志输出文件名-->
<fileNamePattern>${LOG_PATH}${LOG_FILE}_%d{yyyy-MM-dd}_log</fileNamePattern>
<!--最大保留60天的日志-->
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--指定日志输入级别-->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<!--执行具体包目录下的日志输出级别,可用于日志输出过滤(若此处配置,优先级将高于上面配置的日志输出级别)-->
<logger name="com.zzy.reportservice" level="debug"/>
<logger name="com.alibaba" level="info"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="sun.rmi" level="warn"/>
</configuration>
注意上面日志配置文件中的标红部分,通过此种配置将会在外部服务器(例如Tomcat)下的logs目录下生成一个名称为report-service.log日志文件。
这里特别要说明一点:很多人配置springboot日志输出文件时喜欢将文件命名为logback.xml,如果logback.xml配置文件中没有涉及读取全局配置文件(例如application.properties)中的属性时没有问题,一旦有涉及读取全局配置文件中的属性值时,日志配置文件要命名为logback-spring.xml,因为这里涉及到一个加载顺序的问题(logback.xml会在application.properties加载之前加载,logback-spring.xml会在application.properties加载之后加载)