系列
实现自定义SpringBoot框架日志组件の一:日志系统
实现自定义SpringBoot框架日志组件の二:配置文件
实现自定义SpringBoot框架日志组件の三: 自定义pattern
实现自定义SpringBoot框架日志组件の四: 自适应
前言
上一篇 博客已经实现了自定义日志系统,,但是并没有配置任何 日志配置文件,这篇博客就来实现一下
目标
- 针对不同环境,提供不同的配置文件
- local/dev 业务日志级别为debug,且日志会输出到
console
,便于本地调试 - prod 业务日志级别为info,日志仅输出到
文件
,考虑到性能,不会输出到console
1. 配置文件打到 jar 包里

从spring的jar结构里可以看到,spring把日志文件打到了jar包里,通过下面的代码直接加载
loadConfiguration(getPackagedConfigFile("log4j2.xml"), logFile, getOverrides(initializationContext));
观察其结构,看不出来什么,去github看源码,得到了奥秘

发现:
- 文件是放在
resources
里的 - 文件在resources里也有包名
那我们照葫芦画瓢

在idea里,如图

注意:如果直接在idea里创建,会有点问题,只有一级文件夹,名字是
com.github.hwhaocool
, 而不是我们期望的三级文件夹
此时,打出来的包,已经符合我的要求了(jd-gui
打开)

2. 编写配置文件 log4j2-local.xml
内容如下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="CONSOLE_LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%5p} [%clr{%t}{magenta}] %highlight{%-40.40c{1.}} %clr{:}{faint} %m%n%ex</Property>
<Property name="FILE_LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %t %c : %m%n%ex</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}"/>
</Console>
<!--文件输出-->
<RollingFile name="FILE" fileName="logs/service.log" filePattern="logs/service.%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="${FILE_LOG_PATTERN}"/>
<Policies>
<!-- 一天一个新文件(这里的1是一个时间单位,具体单位是filePattern 定义的) -->
<TimeBasedTriggeringPolicy interval="1"/>
<!-- 一个文件最大3g-->
<SizeBasedTriggeringPolicy size="3GB"/>
</Policies>
<!-- 最多保留30个历史日志文件 -->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers>
<AsyncLogger name="org.apache.catalina.startup.DigesterFactory" level="error" />
<AsyncLogger name="org.apache.catalina.util.LifecycleBase" level="error" />
<AsyncLogger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<AsyncLogger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
<AsyncLogger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
<AsyncLogger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
<AsyncLogger name="org.hibernate.validator.internal.util.Version" level="warn" />
<AsyncLogger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<AsyncLogger name="com.github.hwhaocool.log" level="debug"/>
<AsyncRoot level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="FILE" />
</AsyncRoot>
</Loggers>
</Configuration>
稍微解释一下
输出
这时候运行 web-with-log
,再请求一下接口,可以看到下面的输出

看起来还不错,颜色、对齐都有了
不过还是发现一些问题:
- 线程名称对齐的不是很好
- 类名信息太简单了,包名都是缩写
- 只有类的信息,没有方法和行号的信息
- local环境下,业务的debug日志没有输出
其中1属于对齐的问题,2、3 属于信息完整的问题,4属于自适应包名的问题
1、2、3的问题的解决,将会在下一篇博客讲到
4 后面再讲
网友评论