首页 > 解决方案 > Wildfly json 日志格式化程序动态配置未应用

问题描述

Wildfly 20 与一个Logstash实例连接,监听 tcp 端口 5300:

logstash.conf:

input {
 tcp {
    codec => json
    port => "5300"
  }
}

output {
  stdout {}
}

利用其内置的带有套接字连接的 json 日志记录功能,正如wildfly-logstash 中所指出的,不会将日志发送到 logstash,Wildfly 在Wildfly CLI上配置,输入以下语句序列(自动以standalone.xml 结尾):

/subsystem=logging/json-formatter=LOG-STASH:add(key-overrides={timestamp=@timestamp,message=@message,logger-name=@source,host-name=@source_host}, exception-output-type=formatted)

/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=log-stash:add(host=localhost, port=8000)
/subsystem=logging/socket-handler=LOGSTASH-SOCKET:add(named-formatter=LOG-STASH, outbound-socket-binding-ref=log-stash, level=DEBUG)

/subsystem=logging/async-handler=LOGSTASH-ASYNC:add(queue-length=512, subhandlers=[LOGSTASH-SOCKET])

/subsystem=logging/root-logger=ROOT:add-handler(name=LOGSTASH-ASYNC)

它在 logstash 节点的标准输出上生成日志语句,例如:

{
          "level" => "DEBUG",
           "host" => "gateway",
      "processId" => 14972,
       "sequence" => 34696,
       "@version" => "1",
        "@source" => "com.myapplication.TaskService",
   "@source_host" => "device-01",
     "threadName" => "EJB default - 6",
       "threadId" => 215,
"loggerClassName" => "org.slf4j.impl.Slf4jLogger",
            "mdc" => {},
            "ndc" => "",
           "port" => 64210,
    "processName" => "jboss-modules.jar",
     "@timestamp" => 2021-03-31T14:10:19.869Z,
       "@message" => "task execution successfull: MailDaemon"
}

这只是目标的一半,需要另一组属性名称(单个 json 日志消息)以适合我们的企业 logstash 实例。特别是,“host-name”和“logger-name”都没有被写入,尽管已经配置好了;而是记录“@source_host”和@source。

日志格式化程序 LOG-STASH 的进一步适配部分成功。

1) /subsystem=logging/json-formatter=LOG-STASH:write-attribute(name="meta-data",value={service="myapplication-api", serviceversion="1.1.0", instanceId="myapplication-api-1.1.0"})
2) /subsystem=logging/json-formatter=LOG-STASH:write-attribute(name="key-overrides",value=[severity=level,timestamp=@timestamp,message=msg,logger-name=@source,host-name=@source_host])

进一步的简化导致属性存储但未应用:

3) /subsystem=logging/json-formatter=LOG-STASH:write-attribute(name="key-overrides",value={"level"="severity"})
4) /subsystem=logging/json-formatter=LOG-STASH:read-attribute(name="key-overrides")
  1. 添加了作品和元数据。2. 和 3. 没有结果。4.打印出来像

     INFO  [org.jboss.as.cli.CommandContext] {
         "outcome" => "success",
         "result" => {"level" => "severity"}
     }
     {
         "outcome" => "success",
         "result" => {"level" => "severity"}
     }
    

标签: jsonloggingconfigurationlogstashwildfly

解决方案


通过上述设置,以下 Wildfly CLI 命令成功地重命名了所需键的默认值:

/subsystem=logging/json-formatter=LOG-STASH:write-attribute(name="key-overrides",value={"level"="severity","sequence"="trace","thread-id"="pid","logger-class-name"="class","thread-name"="thread"})

这些设置最终位于磁盘standalone.xmllogging.properties的同一文件夹中。在我的工作中,两个文件中配置的键之间存在差异。

请注意,驼峰式键名之类threadId的会产生配置错误。你必须thread-id改用。我通过检查 JBoss 日志库(即查看 Java 源代码)发现了这一点。

产生的日志输出是例如

{
               "pid" => 212,
           "message" => "Synchronizaing finished in 0ms",
          "@version" => "1",
        "loggerName" => "com.myapp.Cache",
        "@timestamp" => 2021-04-08T13:49:00.178Z,
              "port" => 59182,
       "processName" => "jboss-modules.jar",
             "trace" => 4245,
              "host" => "gateway",
          "severity" => "DEBUG",
         "processId" => 10536,
               "mdc" => {},
          "hostName" => "host-alpha",
         "timestamp" => "2021-04-08T15:49:00.176+02:00",
             "class" => "org.slf4j.impl.Slf4jLogger",
               "ndc" => "",
            "thread" => "EJB default - 7"
}

仍然不错的是,拥有字段mdcndc剥夺了输出。


推荐阅读