Filebeat和logstash 使用過程中遇到的一些小問題記錄

一、filebeat 收集軟鏈文件日誌

1.1、場景

  1. 由於我們新部署的Nginx 日誌都是採用的軟鏈的形式。

    lrwxrwxrwx 1 root  root      72 Apr  6 00:00 jy.baidu.com-80-access.log -> /usr/local/openresty/nginx/logs/jy.usmartsg.com-80-access.log.2022040600
    -rw-r--r-- 1 nginx root 4502502 Apr  3 23:59 jy.baidu.com-80-access.log.2022040300
    -rw-r--r-- 1 nginx root 5790629 Apr  5 00:00 jy.baidu.com-80-access.log.2022040400
    -rw-r--r-- 1 nginx root 9166562 Apr  5 23:59 jy.baidu.com-80-access.log.2022040500
    -rw-r--r-- 1 nginx root 2447936 Apr  6 09:31 jy.baidu.com-80-access.log.2022040600
    
  2. 我們收集日誌的時候,通過配置filebeat 收集日誌文件 jy.baidu.com-80-access.log, 因爲這個文件會一直軟鏈到最新的日誌文件。

  3. 但是我們會發現在啓動filebeatfilebeat 並沒有報錯什麼。 但是我們logstash 好像也沒有往es 寫日誌。

1.2、問題排查

  1. 我們首先是通過開啓filebeat 的 debug模式,就是看下 filebeat 的詳細日誌,這一步理論上來說,我們應該先通過kafka 看下是否有日誌寫入kafka。 但是沒有關係,我們通過看 filebeat 的詳細日誌。 可以一步分析到位。

    logging.level: debug
    
  2. 我們在日誌中可以看到下面的信息

    2022-04-03T19:48:21.675+0800        DEBUG        [monitoring]        memqueue/eventloop.go:228        handle ACK took: 54.938µs
    2022-04-03T19:48:21.675+0800        DEBUG        [monitoring]        memqueue/ackloop.go:128        ackloop: return ack to broker loop:1
    2022-04-03T19:48:21.675+0800        DEBUG        [monitoring]        memqueue/ackloop.go:131        ackloop:  done send ack
    2022-04-03T19:48:23.443+0800        DEBUG        [input]        input/input.go:152        Run input
    2022-04-03T19:48:23.443+0800        DEBUG        [input]        log/input.go:174        Start next scan
    2022-04-03T19:48:23.443+0800        DEBUG        [input]        log/input.go:273        File /usr/local/openresty/nginx/logs/jy.usmartsg.com-80-access.log skipped as it is a symlink.
    2022-04-03T19:48:23.443+0800        DEBUG        [input]        log/input.go:195        input states cleaned up. Before: 1, After: 1, Pending: 0
    2022-04-03T19:48:26.443+0800        DEBUG        [input]        input/input.go:152        Run input
    2022-04-03T19:48:26.444+0800        DEBUG        [input]        log/input.go:174        Start next scan
    

    日誌內容

    File /usr/local/openresty/nginx/logs/jy.usmartsg.com-80-access.log skipped as it is a symlink.
    

    我們可以看到文件因爲是軟鏈接所以被忽略了。

  3. 我們查看官方文檔,需要增加配置 symlinks: true

    filebeat.inputs:
    - type: log
      symlinks: true
    
  4. 然後我們重啓filebeat 就可以看到有日誌寫入kafka了。

二、logstash

2.1、logstash 解析日誌不寫入es

每個人的場景不一樣。這裏只提供大概思路。

  1. kafka 是否有數據, 可以kafka consumer 進行訂閱用不同的 group 來同一個 topic。 進行查看是否有kafka數據

  2. logstash 啓動是否有報錯。

    [2022-04-02T20:55:06,432][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.8.0"}
    [2022-04-02T20:55:07,554][ERROR][logstash.agent           ] Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of #, {, } at line 5, column 43 (byte 118) after input {\n  kafka {\n    group_id => \"hz-sg\"\n    topics => [\"hz-sg-nginxlog\"]\n    bootstrap_servers => \"10.59.4.50:9092\"", :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:41:in `compile_imperative'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:49:in `compile_graph'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:11:in `block in compile_sources'", "org/jruby/RubyArray.java:2577:in `map'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:10:in `compile_sources'", "org/logstash/execution/AbstractPipelineExt.java:151:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:22:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:90:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:43:in `block in execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:96:in `block in exclusive'", "org/jruby/ext/thread/Mutex.java:165:in `synchronize'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:96:in `exclusive'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:39:in `execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:334:in `block in converge_state'"]}
    [2022-04-02T20:55:07,807][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
    [2022-04-02T20:55:12,703][INFO ][logstash.runner          ] Logstash shut down.
    
    

    像這種就是配置文件格式可能存在一些問題。

    [2022-04-02T20:36:04,433][ERROR][logstash.pipeline        ] Error registering plugin {:pipeline_id=>"main", :plugin=>"#<LogStash::FilterDelegator:0x5fdbe919>", :error=>"pattern %{SERVICE:service} not defined", :thread=>"#<Thread:0x20114a64 run>"}
    
    

    這種報錯就是我們沒有定義變量的匹配規則。

  3. 還有一種是我們最近遇到了的,就是我在 es 的 output 的時候,引用了一個變量 service 。 但是前面沒有定義這個。最後這個logstash 也沒有報錯,就是寫不到 es 裏面。

            elasticsearch {
                hosts => ["10.59.4.50","10.59.4.51","10.59.4.52"]
                index => "%{[service]-%{+YYYY.MM.dd}"
                template => "/etc/logstash/template/nginx.json"
                template_name => "nginx.json"
                template_overwrite => true
                user => "elastic"
                password => "1111111"
            }
    
    
  4. 開啓日誌debug. /etc/logstash/logstash.yml

    #log.level: debug
    

2.2、logstash 配置多個後端

  1. logstash -f /opt/logstash/conf/conf.d/

    注意/conf.d/ 後面不要加***** 這樣會導致只匹配一個。

  2. 使用多個配置文件裏面的input、filter、output 不是互相獨立的。

    logstash讀取多個配置文件只是簡單的將所有配置文件整合到了一起

    如果要彼此獨立,需要自己加字段,然後在output 判斷一下 ,通過字段進行區分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章