java - 如何使用 Logback 更改 JSON 输出中的键名?
问题描述
这是我的 logback 配置。
<springProfile name="prod">
<root level="info">
<appender name="naki" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${logging_level}</level> <!-- setup via ENV variable log level -->
</filter>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<appendLineSeparator>true</appendLineSeparator> <!-- don't forget line break -->
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>false
</prettyPrint> <!-- in prod never pretty print, line breaks are considered as separate log entry -->
</jsonFormatter>
</layout>
</encoder>
</appender>
</root>
</springProfile>
<springProfile name="dev">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
这是我得到的输出:
{"timestamp":"2020-01-13T13:38:38.001Z","level":"INFO","thread":"main","logger":"com.nakipower.identity.api.config.Application","message":"Started Application in 8.605 seconds (JVM running for 9.439)","context":"default"}
如何将 JSON级别的键名重命名为severity?所以,我得到"severity":"INFO"
而不是"level":"INFO"
. 在使用 logback 配置日志记录时,我实际上可以重命名 JSON 键名吗?
解决方案
您可以扩展ch.qos.logback.contrib.jackson.JacksonJsonFormatter
和覆盖toJsonString(Map m)
方法。在那里,您可以level
将给定地图中的条目替换为带有 key 的新条目severity
。
public class CustomJsonFormatter extends JacksonJsonFormatter{
@Override
public String toJsonString(Map map) throws IOException {
map.put("severity", map.get("level"));
map.remove("level");
return super.toJsonString(map);
}
}
在您的 xml 配置中,在 jsonFormatter 标记中指向您刚刚创建的新格式化程序
<appender name="naki" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level> <!-- setup via ENV variable log level -->
</filter>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
<appendLineSeparator>true</appendLineSeparator> <!-- don't forget line break -->
<jsonFormatter class="mypackage.CustomJsonFormatter"> <!-- Here point to your custom json formatter -->
<prettyPrint>false
</prettyPrint> <!-- in prod never pretty print, line breaks are considered as separate log entry -->
</jsonFormatter>
</layout>
</encoder>
</appender>
推荐阅读
- java - 调用 EntityManager.persist() 时的未知实体
- python - Pandas - 通过选择多列对组中多列的两个数组求和
- hangfire - 如何限制 Hangfire Server 中允许的方法
- firebase - Firebase 的(用户选择的)每个项目的 Cloud Firestore 位置不可更改的政策将来可能会改变吗?
- python - 在 Databricks Python 脚本中使用 URL 时的 CERTIFICATE_VERIFY_FAILED 和 SSLV3_ALERT_HANDSHAKE_FAILURE
- ionic-framework - Ionic:无需滚动即可在屏幕上获取所有应用内容
- c++ - C++ 中的 Fair Reader-Writer Ticket Spinlock 运行缓慢
- php - 在 Lua 中加密字符串,在 PHP 中解密?
- javascript - Ajax 415 响应 - Tango API
- proxy - 如何暂时禁用用于安装软件包的 apt 代理设置