2016-04-15 11 views
8

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'

Trả lời

2

Hãy thử cách sau. Bạn cũng có thể cần phải thêm một số nhập khẩu đối với FieldNamesLifeCycle

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 
} 

Bạn có thể sử dụng trang helper sau trên trang web Logback chuyển đổi cấu hình XML của bạn vào Groovy.

http://logback.qos.ch/translator/asGroovy.html

+0

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 đó. –

1

tôi phải làm một cái gì đó tương tự, mặc dù tôi đã sử dụng LoggingEventCompositeJsonEncoder encoder.

Cách tiếp cận mà tôi đã sử dụng là khai thác thông qua mã bộ mã hóa logstash-logback để tìm ra các lớp thực có liên quan. Rất may, bộ giải mã của IntelliJ khiến việc này không quá đau đớn.

Nếu bạn nhìn vào LogstashEncoder nó đã là một phương pháp public void setFieldNames(LogstashFieldNames fieldNames) - vì vậy những gì bạn cần là một thể hiện của LogstashFieldNames

LogstashFieldNames lần lượt có setters cho setTimestamp và phần còn lại, như vậy trong groovy cú pháp của bạn nên là:

encoder(LogstashEncoder) { 
     fieldNames(LogstashFieldNames) { 
      timestamp = "time" 
      message = "msg" 
     } 
    } 
Các vấn đề liên quan