【问题标题】:How do I customize a GELF appender for log4j2?如何为 log4j2 自定义 GELF 附加程序?
【发布时间】:2020-05-20 20:00:02
【问题描述】:

我们有一个 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 的信息,添加一个捕获线程数据的字段似乎应该很容易,但到目前为止我们的尝试都失败了。我们还想要一个报告某个环境变量值的字段。谁能告诉我如何做这两件事?

【问题讨论】:

    标签: log4j2 graylog gelf graylog3


    【解决方案1】:

    基于 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}" />
    

    提供了我正在寻找的价值。

    【讨论】:

    • $${sys:LB_COOKIE_VALUE} 起作用的事实表明您将其作为系统属性,而不是作为环境变量。
    • @rgoers - 是的,我开始意识到这一点很艰难。帮助找出如何在找不到环境变量时打印出一条消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2019-07-27
    • 2017-01-06
    • 2015-07-13
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多