Java日志Appender格式指令查询及行号输出需求
日志格式占位符全解及行号动态输出方案
一、通用日志格式占位符列表(以主流Logback框架为例)
%d:输出日志事件的日期时间,可自定义格式,比如%d{yyyy-MM-dd HH:mm:ss.SSS}%p/%level:输出日志级别(DEBUG/INFO/WARN/ERROR等),%-5p表示左对齐且占5个字符宽度%c/%logger:输出日志记录器名称(通常是类的全限定名),可缩写,比如%c{1}只显示类名%m/%msg/%message:输出日志消息内容%n:输出换行符%L:动态输出日志语句所在的代码行号(就是你要的指令)%M:输出日志语句所在的方法名%F:输出日志语句所在的文件名%t/%thread:输出产生日志的线程名%X{key}:输出MDC(映射诊断上下文)中指定key的值,用于多线程场景追踪请求%ex/%exception:输出异常栈信息,%ex{short}只显示异常类和消息,%ex{full}显示完整栈%replace():对输出内容做替换,比如%replace(%msg){'secret','***'}可屏蔽敏感信息
二、动态输出行号的配置方法
1. 常规控制台/文件日志配置
直接在pattern里加%L就行,比如:
logging.pattern.console = %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c:%L - %m%n
这样就能自动输出日志对应的代码行号,完全不用手动做栈追踪。
2. JSON格式日志配置(以Logback的JSON编码器为例)
如果要输出JSON格式日志,在logback-spring.xml这类配置文件里,用LogstashEncoder或JsonLayout配置行号字段:
方式一:用LogstashEncoder
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <fieldNames> <timestamp>timestamp</timestamp> <level>level</level> <logger>logger</logger> <message>message</message> <lineNumber>line_number</lineNumber> <!-- 开启行号字段 --> <method>method</method> <!-- 可选,输出方法名 --> <fileName>file_name</fileName> <!-- 可选,输出文件名 --> </fieldNames> </encoder> </appender>
方式二:用JsonLayout
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"/> <appendLineSeparator>true</appendLineSeparator> <includes>timestamp, level, logger, message, lineNumber, method, fileName</includes> </layout> </appender>
配置后生成的JSON日志里会自动带上line_number字段,值就是日志语句的行号。
注意点
%L这类获取代码位置的指令会有一定性能损耗,因为要读取栈信息,生产环境如果对性能要求高,建议只在DEBUG级别开启,或者谨慎使用。- 不同日志框架的占位符差异不大,比如Log4j2的行号指令也是
%L,但老旧框架可能有区别,尽量用当前主流的Logback/Log4j2。
内容的提问来源于stack exchange,提问作者Urman Ratneshwar
相关产品推荐
相关产品推荐

