Logback.groovy LogstashEncoder更改字段名
我有一个logback.groovy,它通过一些自定义字段将数据发送到网络上的日志存储:Logback.groovy LogstashEncoder更改字段名,groovy,logstash,logstash-logback-encoder,Groovy,Logstash,Logstash Logback Encoder,我有一个logback.groovy,它通过一些自定义字段将数据发送到网络上的日志存储: appender("LOGSTASH", LogstashTcpSocketAppender) { encoder(LogstashEncoder) { customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }""" } remoteHost = "logstashliste
appender("LOGSTASH", LogstashTcpSocketAppender) {
encoder(LogstashEncoder) {
customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
}
remoteHost = "logstashlistener.host.name"
port = 5000
}
到目前为止还不错。但是,我需要清理一些对elasticsearch下游无效的字段名。
根据LogstashEncoder文档,可以这样实现:
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<timestamp>time</timestamp>
<message>msg</message>
...
</fieldNames>
</encoder>
时间
味精
...
这似乎很好,但我必须将其放入logback.groovy符号中。
我尝试使用hashmap、字符串等,但最终总是使用
无法将类为“xxxx”的对象“xxxx”强制转换为类“net.logstash.logback.fieldnames.LogstashFieldNames”
尝试以下操作。您可能还需要为字段名
和生命周期
appender("LOGSTASH", LogstashTcpSocketAppender) {
encoder(LogstashEncoder) {
customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
FieldNames... aFieldNames = new FieldNames()
aFieldNames.timestamp = "time"
aFieldNames.message = "msg"
if(aFieldNames instanceof LifeCycle)
aFieldNames.start()
fieldNames = aFieldNames
}
remoteHost = "logstashlistener.host.name"
port = 5000
}
您可以使用Logback网站上的以下帮助程序页面将XML配置转换为Groovy
我不得不做类似的事情,尽管我使用的是
LoggingEventCompositeJsonEncoder
编码器
我必须使用的方法是通过logstash logback编码器代码挖掘出真正涉及的类。谢天谢地,IntelliJ的反编译器使这一点不太痛苦
如果您查看LogstashEncoder,它有一个方法public void setFieldNames(LogstashFieldNames fieldNames)
——因此您需要的是LogstashFieldNames的实例
LogstashFieldNames依次具有setTimestamp
和其他设置器,因此在groovy中,您的语法应该是:
encoder(LogstashEncoder) {
fieldNames(LogstashFieldNames) {
timestamp = "time"
message = "msg"
}
}
这对我来说很好。此示例将属性“logger_name”重命名为“loggerName”
有趣的答案。可悲的是,它并没有真正起作用。字段名本身不存在。我把它转换成LogStashFieldName并改编了。。。(这会导致编译错误),但它抱怨无法设置该类的timestamp属性。
import net.logstash.logback.fieldnames.LogstashFieldNames
appender('STDOUT', ConsoleAppender) {
encoder(net.logstash.logback.encoder.LogstashEncoder) {
// Rename standard fields
fieldNames = new LogstashFieldNames(logger:"loggerName")
}
}