json - 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")
添加了作品和元数据。2. 和 3. 没有结果。4.打印出来像
INFO [org.jboss.as.cli.CommandContext] { "outcome" => "success", "result" => {"level" => "severity"} } { "outcome" => "success", "result" => {"level" => "severity"} }
解决方案
通过上述设置,以下 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.xml
上logging.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"
}
仍然不错的是,拥有字段mdc
并ndc
剥夺了输出。
推荐阅读
- android - 无法在操作栏中添加图像
- python - 如果参数很长,Python Post 请求会失败并显示 400/ConnectionResetError(10054)
- marklogic - 如何通过 Azure AD 对 Marklogic 管理界面 (8001) 进行身份验证
- ruby - 系统版本太旧时如何安装 Homebrew Portable Ruby
- html - 表格边框在右侧越界
- latex - 重复标题和日期 R Markdown PDF
- python - 双 for 循环从多个 url 中提取数据
- php - 如何隐藏价格高于1的产品
- laravel - Laravel 如何将值更新到另一个表中的另一列?
- xamarin - Xamarin Forms Android Iframe 导航事件未触发