我有一个logback.groovy,它通过一些自定义字段将数据发送到网络上的logstash:
appender("LOGSTASH", LogstashTcpSocketAppender) {
encoder(LogstashEncoder) {
customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
}
remoteHost = "logstashlistener.host.name"
port = 5000
}
到目前为止还不错。然而,我需要清理一些对下游弹性搜索无效的字段名。基于LogstashEncoder文档,可以这样实现:
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<timestamp>time</timestamp>
<message>msg</message>
...
</fieldNames>
</encoder>
这看起来很棒,但我必须将其放入logback.groovy表示法中。我尝试过使用hashmap、string等,但最终总是使用Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'
尝试以下操作。您可能还需要为FieldNames
和LifeCycle
添加一些导入
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。
http://logback.qos.ch/translator/asGroovy.html
尽管我使用的是LoggingEventCompositeJsonEncoder
编码器,但我也不得不做一些类似的事情。
我不得不使用的方法是挖掘logstash logback编码器代码,以计算出所涉及的真实类。值得庆幸的是,IntelliJ的反编译器让这一切变得不太痛苦。
如果你看看LogstashEncoder,它有一个方法public void setFieldNames(LogstashFieldNames fieldNames)
,所以你需要的是LogstashFieldNames 的一个实例
LogstashFieldNames反过来为setTimestamp
和其他部分设置了setter,所以在groovy中,您的语法应该是:
encoder(LogstashEncoder) {
fieldNames(LogstashFieldNames) {
timestamp = "time"
message = "msg"
}
}
这对我来说很好;logger_name"至";loggerName";
import net.logstash.logback.fieldnames.LogstashFieldNames
appender('STDOUT', ConsoleAppender) {
encoder(net.logstash.logback.encoder.LogstashEncoder) {
// Rename standard fields
fieldNames = new LogstashFieldNames(logger:"loggerName")
}
}