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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341