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
# 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个字段,而且匹配成功,不继续往下执行,这样识别的内容就不全。