Tôi có một logback.groovy đó gửi dữ liệu đến một logstash trên mạng với một số lĩnh vực tùy chỉnh:Logback.groovy LogstashEncoder tên trường làm thay đổi
appender("LOGSTASH", LogstashTcpSocketAppender) {
encoder(LogstashEncoder) {
customFields = """{ "token": "xxxxx", "environment":"dev", "some_property":"foobar" }"""
}
remoteHost = "logstashlistener.host.name"
port = 5000
}
Cho đến nay rất tốt. Tuy nhiên, tôi cần phải dọn dẹp một số tên trường không hợp lệ cho elasticsearch ở hạ lưu. Dựa trên các tài liệu LogstashEncoder, điều này có thể đạt được như thế này:
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<fieldNames>
<timestamp>time</timestamp>
<message>msg</message>
...
</fieldNames>
</encoder>
Điều này có vẻ lớn nhưng tôi phải phù hợp này vào các ký hiệu logback.groovy. Tôi đã thử dưới dạng băm, chuỗi và hơn thế nữa nhưng luôn kết thúc bằng cách Cannot cast object 'xxxx' with class 'xxxx' to class 'net.logstash.logback.fieldnames.LogstashFieldNames'
Câu trả lời thú vị. Đáng buồn thay, nó không thực sự hiệu quả. FieldNames không tồn tại trên mỗi se. Tôi đã chuyển đổi nó thành LogstashFieldNames và điều chỉnh ... (cho một lỗi biên dịch) nhưng nó phàn nàn rằng nó không thể thiết lập thuộc tính dấu thời gian của lớp đó. –