service-logging
简单使用 logback.xml 配置示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--项目名称-->
<property name="ProjectName" value="MyLog" />
<!--是否需要对json格式日志美化-->
<property name="JsonPretty" value="true" />
<!--是否打开显示前缀的功能-->
<property name="PrefixSwitch" value="false" />
<!--要显示的前缀字符串-->
<property name="PrefixText" value="~~~json~~~" />
<contextName>${ProjectName}</contextName>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.nofdev.logging.CustomJsonLayout">
<appendLineSeparator>true</appendLineSeparator>
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
<timestampFormatTimezoneId>UTC</timestampFormatTimezoneId>
<jsonFormatter class="org.nofdev.logging.CustomJacksonJsonFormatter">
<prettyPrint>${JsonPretty}</prettyPrint>
</jsonFormatter>
<logPrefix>
<prefixSwitch>${PrefixSwitch}</prefixSwitch>
<prefixText>${PrefixText}</prefixText>
</logPrefix>
<!--对日志的某些键值对统一处理,具体使用方法见单元测试,如果你不需要可以注释掉这段代码-->
<logPostProcessor class="org.nofdev.logging.CustomPostProcessor"/>
</layout>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
</root>
<logger name="org.nofdev" level="INFO"/>
<logger name="org.apache" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<logger name="org.eclipse.jetty" level="INFO"/>
<logger name="jndi" level="INFO"/>
<logger name="org.hibernate" level="INFO"/>
</configuration>
与SpringBoot整合 logback-spring.xml 完整示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--项目名称-->
<property name="ProjectName" value="MyLog" />
<!--是否需要对json格式日志美化-->
<property name="JsonPretty" value="true" />
<!--是否打开显示前缀的功能-->
<property name="PrefixSwitch" value="false" />
<!--要显示的前缀字符串-->
<property name="PrefixText" value="~~~json~~~" />
<contextName>${ProjectName}</contextName>
<!--development,develop 环境会激活这里的配置-->
<springProfile name="development,develop">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.nofdev.logging.CustomJsonLayout">
<appendLineSeparator>true</appendLineSeparator>
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
<timestampFormatTimezoneId>UTC</timestampFormatTimezoneId>
<jsonFormatter class="org.nofdev.logging.CustomJacksonJsonFormatter">
<prettyPrint>${JsonPretty}</prettyPrint>
</jsonFormatter>
<logPrefix>
<prefixSwitch>${PrefixSwitch}</prefixSwitch>
<prefixText>${PrefixText}</prefixText>
</logPrefix>
<!--对日志的某些键值对统一处理,具体使用方法见单元测试,如果你不需要可以注释掉这段代码-->
<logPostProcessor class="com.company.logging.CustomPostProcessor"/>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
<logger name="com.company" level="DEBUG"/>
<!--JPA 显示执行的SQL和参数-->
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="org.hibernate.type" level="TRACE"/>
</springProfile>
<!--production,pre,testing,test 环境会激活这里的配置-->
<springProfile name="production,pre,testing,test">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.nofdev.logging.CustomJsonLayout">
<appendLineSeparator>true</appendLineSeparator>
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
<timestampFormatTimezoneId>UTC</timestampFormatTimezoneId>
<jsonFormatter class="org.nofdev.logging.CustomJacksonJsonFormatter">
<prettyPrint>${JsonPretty}</prettyPrint>
</jsonFormatter>
<logPrefix>
<prefixSwitch>${PrefixSwitch}</prefixSwitch>
<prefixText>${PrefixText}</prefixText>
</logPrefix>
<!--对日志的某些键值对统一处理,具体使用方法见单元测试,如果你不需要可以注释掉这段代码-->
<logPostProcessor class="com.company.logging.CustomPostProcessor"/>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
<logger name="com.company" level="INFO"/>
</springProfile>
<logger name="org.nofdev" level="INFO"/>
<logger name="org.apache" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<logger name="org.eclipse.jetty" level="INFO"/>
<logger name="jndi" level="INFO"/>
<logger name="org.hibernate" level="INFO"/>
</configuration>
private final CustomLogger logger = CustomLogger.getLogger(HelloFacadeImpl.class);
logger.debug("错误概述", e) { ["custDate": "自定义键值对", "func": debugStr()] }
更多用法参考测试代码 CustomLoggerSpec
后置日志输出处理器
通过实现 LogPostProcessor 接口, 可以改变日志的输出结果,去掉一些key,或者添加一些key, 比如所有的日志都需要调用链Id打印出来,在众多开发人员无感知的情况下,把CallID统一插入到日志里面 你可以对里面的键值对做任何增删改操作,但是注意不要执行太消耗时间的功能,否则会影响日志效率
Workaround
因为本组件是利用占位符传递参数输出闭包的返回值, 所以原来支持的 message="xxx{}{}" 这种占位符写法就失效了, 并且因为取值是在 Layout 上做的, 所以如果不用自定义的 layout 话, 闭包内的内容会丢失(其他参数不会)