如何为 log4j2 自定义 GELF appender?
How do I customize a GELF appender for log4j2?
我们有一个 log4j2-graylog.xml 文件,我们使用 biz.paluch.logging.gelf.log4j2
包将 log4j 输出桥接到 GrayLog 3.0。此配置文件基于此 example:
<?xml version="1.0" encoding="utf-8"?>
<Configuration monitorInterval="60" packages="biz.paluch.logging.gelf.log4j2">
<Appenders>
<Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm" additionalFieldTypes="environment=String,application=String">
<Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" />
<Field name="level" pattern="%level" />
<Field name="simpleClassName" pattern="%C{1}" />
<Field name="className" pattern="%C" />
<Field name="server.fqdn" pattern="%host{fqdn}" />
<Field name="threadName" /> <!-- didn't seem to work -->
<!-- This is a static field -->
<Field name="application" literal="PISM-webapp" />
</Gelf>
</Appenders>
<Loggers>
<Logger name="com.xxx" level="DEBUG" additivity="false">
<AppenderRef ref="gelf" />
</Logger>
</Loggers>
</Configuration>
基本上可以了。我们 Java 对 log4j 日志记录的调用显示在 GrayLog 中。
根据here的信息,添加一个捕获线程数据的字段似乎应该很容易,但到目前为止我们的尝试都失败了。我们还想要一个报告特定环境变量值的字段。谁能告诉我如何做这两件事中的任何一件?
基于 log4j2 手册中的 information,我能够通过将 threadName
添加到 additionalFieldTypes
并使用 %t
模式说明符来获取线程名称所以:
<Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true"
mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm"
additionalFieldTypes="environment=String,application=String,threadName=String,fbHost=String">
...
<Field name="threadName" pattern="%t" />
但是,当我尝试使用页面上提供的语法来检索环境变量的值时,如下所示:
<Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE}" />
我没有在 GrayLog 中获取 LB_COOKIE_VALUE
环境值的值。相反,我得到了文字字符串 - “${env:LB_COOKIE_VALUE}”。这个 Whosebug post 提供了足够的信息来调试问题。当我提供默认值时,
<Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE:-unset_env_LB_COOKIE_VALUE}" />
我输出的是"unset_env_LB_COOKIE_VALUE",说明没有设置环境变量。但是,设置了Java系统属性,所以
<Field name="fbHost" pattern="$${sys:LB_COOKIE_VALUE:-unset_sys_LB_COOKIE_VALUE}" />
提供了我正在寻找的值。
我们有一个 log4j2-graylog.xml 文件,我们使用 biz.paluch.logging.gelf.log4j2
包将 log4j 输出桥接到 GrayLog 3.0。此配置文件基于此 example:
<?xml version="1.0" encoding="utf-8"?>
<Configuration monitorInterval="60" packages="biz.paluch.logging.gelf.log4j2">
<Appenders>
<Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm" additionalFieldTypes="environment=String,application=String">
<Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" />
<Field name="level" pattern="%level" />
<Field name="simpleClassName" pattern="%C{1}" />
<Field name="className" pattern="%C" />
<Field name="server.fqdn" pattern="%host{fqdn}" />
<Field name="threadName" /> <!-- didn't seem to work -->
<!-- This is a static field -->
<Field name="application" literal="PISM-webapp" />
</Gelf>
</Appenders>
<Loggers>
<Logger name="com.xxx" level="DEBUG" additivity="false">
<AppenderRef ref="gelf" />
</Logger>
</Loggers>
</Configuration>
基本上可以了。我们 Java 对 log4j 日志记录的调用显示在 GrayLog 中。
根据here的信息,添加一个捕获线程数据的字段似乎应该很容易,但到目前为止我们的尝试都失败了。我们还想要一个报告特定环境变量值的字段。谁能告诉我如何做这两件事中的任何一件?
基于 log4j2 手册中的 information,我能够通过将 threadName
添加到 additionalFieldTypes
并使用 %t
模式说明符来获取线程名称所以:
<Gelf name="gelf" host="10.13.10.192" port="12201" version="1.1" extractStackTrace="true" filterStackTrace="true"
mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192" originHost="swarm"
additionalFieldTypes="environment=String,application=String,threadName=String,fbHost=String">
...
<Field name="threadName" pattern="%t" />
但是,当我尝试使用页面上提供的语法来检索环境变量的值时,如下所示:
<Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE}" />
我没有在 GrayLog 中获取 LB_COOKIE_VALUE
环境值的值。相反,我得到了文字字符串 - “${env:LB_COOKIE_VALUE}”。这个 Whosebug post 提供了足够的信息来调试问题。当我提供默认值时,
<Field name="fbHost" pattern="$${env:LB_COOKIE_VALUE:-unset_env_LB_COOKIE_VALUE}" />
我输出的是"unset_env_LB_COOKIE_VALUE",说明没有设置环境变量。但是,设置了Java系统属性,所以
<Field name="fbHost" pattern="$${sys:LB_COOKIE_VALUE:-unset_sys_LB_COOKIE_VALUE}" />
提供了我正在寻找的值。