有个任务停留在任务列表中很久了:使用 Appenders 完成 loger4j 的日志推送,始终没有成功实现。追其原因,仍然是官方的文档没有认真看。在 spring-boot 的项目中看到 log4j,就想当然的认为 Spring-boot 使用的是 log4j,然后不假思索的去 google。最终导致的就是:功能没有实现,而且还浪费了很多不必要的时间,最后:还是老老实实的回来阅读 spring-boot 的官方文档。
本文主要对官方文档 Logging 部分进行解读。原文地址:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html.
如果你使用的是不是最新版本,那么应该使用 https://docs.spring.io/spring-boot/docs/ 版本号 /reference/htmlsingle/#boot-features-logging
如:https://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#boot-features-logging
76 日志
在 web 开中,我们仅需要依赖于 spring-boot-starter-web 便自动启用了日志系统 Logback。
如果仅仅是想改变日志的等级,则可以直接使用 logging.level 前缀在 application.properties 中进行设置,比如:
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
除了控制日志的等级外,还可以使用 logging.file 来定义日志输入到的文件位置。
如果我们还想配置更多选项,则可以在 classpath(resourse)中定义 logback.xml 或 logback-spring.xml。
76.1 配置 Logback
找到 logback.xml 或 logback-spring.xml,复制以下基本内容:
<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
<include resource=”org/springframework/boot/logging/logback/base.xml”/>
<logger name=”org.springframework.web” level=”DEBUG”/>
</configuration>
使用 idea 的 ctrl+ o 来打开 spring-boot jar 中的 base.xml,我们会看到配置信息包含一些特殊的字符,解读如下:
${PID} 当前的进程 ID
${LOG_FILE} 如果设置了 logging.file,则使用 logging.file 做为日志输入文件。
${LOG_PATH} 同上. 指定日志输出路径。
${LOG_EXCEPTION_CONVERSION_WORD} ..
我们自己定义日志输入的方式和字符串时,当然也可以使用它们了。
76.1.1 配置:将日志仅写入文件
如果我们想禁用控制台的日志输出(生产环境中,我们的确是要这么做的),然后把日志写入某个日志文件的话。那么需要新建 logback-spring.xml,并引入 file-appender.xml, 比如:
<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
<include resource=”org/springframework/boot/logging/logback/defaults.xml” />
<property name=”LOG_FILE” value=”${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}”/>
<include resource=”org/springframework/boot/logging/logback/file-appender.xml” />
<root level=”INFO”>
<appender-ref ref=”FILE” />
</root>
</configuration>
然后:在 application.properties 定义 logging.file 来指定日志文件位置. 例:
logging.file=myapplication.log
再看看上面是怎么回事:打开 org/springframework/boot/logging/logback/file-appender.xml 内容如下:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!–
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
–>
<included>
<appender name=”FILE”
class=”ch.qos.logback.core.rolling.RollingFileAppender”>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class=”ch.qos.logback.core.rolling.FixedWindowRollingPolicy”>
<fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
</rollingPolicy>
<triggeringPolicy
class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”>
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
</included>
注意:这里面有个 <appender name=”FILE”,指定了 appender 名称为 FILE,对应 logback-spring.xml 的以下语句:
<root level=”INFO”>
<!– 日志等级 –>
<appender-ref ref=”FILE” />
<!– 指定 appender 为 FILE, 则前面我们刚刚找到的 name 值 –>
</root>
总结
有了以上内容,我们知道了如下知识点:
spring-boot 默认使用的是 Logback 而非 log4j。
我们可以单独建立 logback-spring.xml 来细化 Logback 的配置。
在 Logback 中,是可以指定使用不同的 appender 来定义日志的输出的。
是否可以自定义 appender 来达到将日志输出到我们的日志服务器,从而达到系统监控的目的呢?