nginx部分配置直接用json,省去很多麻烦

   log_format json '{"@timestamp":"$time_iso8601",'
                     '"server_addr":"$server_addr",'
                     '"remote_addr":"$remote_addr",'
                     '"http_x_forwarded_for":"$http_x_forwarded_for",'
                     '"body_bytes_sent":$body_bytes_sent,'
                     '"request_uri":"$request_uri",'
                     '"request_method":"$request_method",'
                     '"server_protocol":"$server_protocol",'
                     '"scheme":"$scheme",'
                     '"request_time":$request_time,'
                     '"upstream_response_time":"$upstream_response_time",'
                     '"upstream_addr":"$upstream_addr",'
                     '"host":"$host",'
                     '"uri":"$uri",'
                     '"http_referer":"$http_referer",'
                     '"http_user_agent":"$http_user_agent",'
                     '"status":$status}';

filebeat前台启动命令 filebeat -e -c filebeat.yml -d "publish"

filebeat配置部分:

filebeat.inputs:
- type: log
  enabled: true

  paths:
    - /data/wwwlogs/www.myzabbix.com_access.log
  
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

setup.template.settings:
  index.number_of_shards: 1

output.logstash:
  hosts: ["192.168.80.11:5041"]

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

logstash前台启动命令 /usr/share/logstash/bin/logstash -f 文件名

logstash配置部分:

input {
    beats {
        port => 5041  #配置文件输入的端口号。
        #codec => json
    } 
}
filter {
    #if [type] == "log" {
        mutate {
            gsub => ["message", "\\x", "\\\x"]
        }
        
        json {
            source => "message"
        }
        
        mutate {
            remove_field => [ "message" ]
        }
        mutate {
            remove_field => [ "ecs" ]
        }
        mutate {
            remove_field => [ "agent" ]
        }
        mutate {
            remove_field => [ "@version" ]
        }
    
        if "HEAD" in [request_method] {
            drop {}
        }

        useragent {
            source => "http_user_agent"
            target => "ua"
        }


        if "-" in [upstream_response_time] {
            mutate {
                replace => {
                    "upstream_response_time" => "0"
                }
            }
        }

        mutate {
            convert => ["upstream_response_time","float"]
        }
        mutate {
            convert => ["status", "integer"]
        }

        geoip {
            source => "remote_addr"
            database => "/etc/logstash/GeoLite2-City.mmdb"
            target => "geoip"
        }
    #}
}

output {
    #if [status] > 300 {
    #    exec {
    #        command => "/usr/bin/echo '网页url是%{request_uri}'"
    #    }
    #}else{
    #    exec {
    #        command => "/usr/bin/echo '网页状态码是%{status}'"
    #    }
    #}
    #stdout {
    #    codec => rubydebug
    #}

   elasticsearch{

              hosts => ["http://192.168.80.11:9200"]

              index => "zabbixlog-%{+YYYY.MM.dd}"

              #document_type => "sparkfileType"

   }

}

注释部分可以打开调试,codec => rubydebug代表输出到界面,还可以输出到file,if else注释部分可以判断页面 url状态码,如果有问题调用外部命令发送报警通知。也可以一段时间内达到N次错误发送报警通知,具体根据业务来调试。