我有一个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'
答案 0 :(得分:2)
尝试以下方法。您可能还需要为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。
答案 1 :(得分:1)
我必须做类似的事情,尽管我使用的是LoggingEventCompositeJsonEncoder
编码器。
我必须使用的方法是挖掘logstash-logback-encoder代码以找出所涉及的真实类。值得庆幸的是,IntelliJ的反编译器使这不太痛苦。
如果你看一下LogstashEncoder,它有一个方法public void setFieldNames(LogstashFieldNames fieldNames)
- 所以你需要的是一个LogstashFieldNames实例
LogstashFieldNames又有setTimestamp
和其他的设置器,所以在groovy中你的语法应该是:
encoder(LogstashEncoder) {
fieldNames(LogstashFieldNames) {
timestamp = "time"
message = "msg"
}
}
答案 2 :(得分:0)
这对我来说很好用。本示例将属性“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")
}
}