Logsatsh 实践

logsatsh 使用中多input与output

作中 在配置es的时候需要对logstash进行配置,然而根据功能分配

input {
    log4j {
        type => "jpa"
        host => "192.168.51.73"
        port => 4560
    }

    log4j {
        type => "jpatest"
        host => "192.168.51.73"
        port => 4567
    }
}
output {
    stdout {
      codec => rubydebug
    }
    if [type] =="jap"{
        elasticsearch{
            hosts => ["192.168.51.73:9200"]
            index => "logsatsh-jpa-%{+YYYY.MM.dd}"
            document_type => "log4jboot_type
        }
    } else if [type] == "jpatest"{
        elasticsearch{
            hosts => ["192.168.51.73:9200"]
            index => "logsatsh-jpatest-%{+YYYY.MM.dd}"
            document_type => "log4jboot_type"
        }
    }else{
        elasticsearch{
            hosts => ["192.168.51.73:9200"]
            index => "log4jboot-%{+YYYY.MM.dd}"
            document_type => "log4jboot_type"
        }
    }

}

input 从文件中读取

input{
     file{
        path => ["D:\Program Files (x86)\apache-tomcat-7.0.69-eclipse\apache-tomcat-7.0.69\logs\zjgqjyError.log"]
        type => "zjgqjy_error_file"
        start_position => "beginning"
      }        
}

使用codec+multiline来处理跨行的日志
log4j里面的记录的java程序发生异常时,经常 会抛出一大堆异常
在input阶段的编码过程中,加入正则判断:

input{
    file{
        path => ["D:\Program Files (x86)\apache-tomcat-7.0.69-eclipse\apache-tomcat-7.0.69\logs\zjgqjyError.log"]
        type => "zjgqjy_error_file"
        start_position => "beginning"
        codec => multiline {
            pattern => "(^.+[ERROR]:.+)|(^.+Exception:.+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Causedby:.+)"
            what => "previous"
        }
    }
}

对 multiline 插件来说,有三个设置比较重要:negate、pattern 和 what。

negate
    类型是 boolean
    默认为 false
    否定正则表达式(如果没有匹配的话)。
pattern
    必须设置
    类型为 string
    没有默认值
    要匹配的正则表达式。
what
    必须设置
    可以为 previous 或 next
    没有默认值
    如果正则表达式匹配了,那么该事件是属于下一个或是前一个事件?

log4j - logStash - redis - logstash - elasticsearch

image.png
# log4j_to_redis 
input {
    log4j {
        type => "jpatest" 
        host => "192.168.51.73"
        port => 4567
    }
}
output {

        redis {
            host => "192.168.51.73"   # redis主机地址
            port => 6379              # redis端口号
            #db => 8                   # redis数据库编号
            data_type => list    # 使用list模式
            key => "logstash_list_jpatest"  # 发布通道名称
        }

}
#redis_to_elasticsearch
input {
   redis {
        data_type => "list"
        key => "logstash_list_jpatest"
        host => "192.168.51.73"
        port => 6379
        threads => 5 #使用多少个线程去读
    }

}
output {

    elasticsearch{
        hosts => ["192.168.51.73:9200"]
        index => "logsatsh-redis-test-%{+YYYY.MM.dd}"
        document_type => "log4jboot_type"
    }
}

ogStash::Inputs::Redis 支持三种 data_type(实际上是redis_type),不同的数据类型会导致实际采用不同的 Redis 命令操作:

  • list => BLPOP
  • channel => SUBSCRIBE
  • pattern_channel => PSUBSCRIBE

这里我们使用 redis的 list 模式,其他两种方式是订阅、发布模式, 这种方式在需要扩展 logstash 成多节点集群的时候,会出现一个问题:通过频道发布的一条信息,会被所有订阅了该频道的 logstash 进程同时接收到,然后输出重复内容!

Grok 正则捕获

在 logsatsh 的使用中,对于日志的收集通常需要对对应的数据进行捕获,将日志格式话,这里需要使用Logstash filter中基于正则的插件gork。

gork 内置了120多个正则, 比如常见的Apache的log格式,Nginx的log格式 上面的正则库都有成型的正则式,省去了自己编写正则一大部分的工作

filter{
    grok {
        match => { "message" => "client:%{WORD:client},servername:%{WORD:servername}" } 
    }
}

上面代码里面的 WORD 就是内置的字符串正则,同样的还有DATESTAMP_CN,IP,MAC等,通过组合可以将日志格式化,变成json 的格式存储。

  grok {
         match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|%{GREEDYDATA:exception}\|" }
        match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|"  }
        match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|%{WORD:name}\|Oid: %{WORD:oid}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|"  }
         match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|%{WORD:result}\|"  }
         match => { "message" => "%{DATESTAMP_CN:[@metadata][logdate]} .* - %{WORD:opeType}\|IP: %{IP:ip}\|MAC: %{GREEDYDATA:mac}\|" }
         remove_field  => "message"
 }

首先行首使用DATESTAMP_CN规则来识别时间,并赋值给logdate字段名;然后.识别任意字符串(.代表任意一个字符,包括特殊字符,代表个数是任意个);然后使用WORD规则(即匹配字符串规则,不包含特殊字符)识别到字符串并赋值给opeType字段;后面同理。这些WORD、IP、GREEDYDATA规则都是logstash内部grok-patterns文件已经定义好了的规则。用户可以直接拿来使用。
remove_field => "message"表示解析完成之后删除原来的 message字段,避免重复。
注意:5种正则规则的上下顺序,下面的规则放在上面会导致可能内容解析不全,比如源数据是:请求交易名|操作员登录名|操作员编号|ip地址|mac地址|返回结果|异常信息,如果按照“请求交易名|ip地址|mac地址|”规则去匹配,只能识别出3个字段,而且匹配成功,不继续往下执行,这样识别的内容就不全。

你可能感兴趣的:(Logsatsh 实践)