1. 程式人生 > 實用技巧 >elk蒐集日誌,實現logstash根據message中結構不同動態建立索引並擴充套件功能,區分message中json和非json資料簡單方式

elk蒐集日誌,實現logstash根據message中結構不同動態建立索引並擴充套件功能,區分message中json和非json資料簡單方式

蒐集日誌,但是框架本身也會列印很多日誌是字串的。我們自己希望的日誌用json,但是又需要json欄位可以擴充套件,logstash收集日誌後都放在了message欄位中,我們自定義列印的是json串,spring列印的是string,為此我們要分別處理日誌,把框架日誌和一般資訊日誌和我們的有用資料日誌分開,並且有用資料記錄的日誌可以按照不同索引分類

為此我們的蒐集日誌時需要動態處理

logstash.conf如下:

input {
    tcp {  
    ##host:port就是上面appender中的 destination,這裡其實把logstash作為服務,開啟9601埠接收logback發出的訊息  
        host 
=> "寫你的logstash-ip" port => 埠 #模式選擇為server mode => "server" tags => ["tags"] ##格式json codec=>"json" } } filter { #可以是你自定義的一個特殊標識如indexName(自定義日誌中必然存在,其他不存在的一個欄位key), 以此來區分message的內容是json的可以轉成json,並將json的key值及巢狀key值放在elasticsearch的一級別下
if "indexName" in [message]{ json { source => "message" } mutate { add_field => { "exttmp" => "%{ext}" } } json { source => "exttmp" remove_field => ["exttmp"] } } } output { if
"indexName" in [message]{#####收集特殊關注的自定義日誌 elasticsearch { #ES地址 hosts => "你的kibana-ip:埠" #自定義索引蒐集我們重點關注的日誌資料 index => "%{[indexName]}" } stdout { codec => rubydebug} }else {#####收集不特殊關注的自定義日誌或框架日誌 elasticsearch { #kibana hosts => "你的kibana-ip:埠" #專案名做索引蒐集一般的日誌 index => "%{[project]}" } stdout { codec => rubydebug} } }

loggerback.xml

<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>配置你logstash ip:埠</destination>
        <!-- encoder必須配置,有多種可選 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
            <customFields>{"project":"elasticsearch-test"}</customFields>
        </encoder>
    </appender>
    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="stash" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>