如何为log4j2自定义GELF追加程序?

时间:2020-02-04 22:57:16

标签: log4j2 graylog gelf graylog3

我们有一个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>    

基本上可以。我们对log4j日志的Java调用显示在GrayLog中。

根据here的信息,添加一个捕获线程数据的字段似乎应该很容易,但是到目前为止,我们的尝试都失败了。另外,我们想要一个报告特定环境变量值的字段。有人可以告诉我如何做这两个事情吗?

1 个答案:

答案 0 :(得分:0)

基于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}”。该StackOverflow 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}" />

提供了我想要的值。