jjzjj

logstash 和 filebeat多行日志 合并

消逝的异次元 2023-07-25 原文

多行日志合并问题

先来描述下碰到的问题哈:
从服务日志来看,由于 打印的时候,日志会有换行的情况,那么filebeat会把一行一行的日志写入到kafka中,这样的话,有换行的日志就没办法连在一起,对查找日志来说不方便。
而且,由于logstash中我们设置了过滤规则,因此匹配不到规则的 一行日志就会被忽略到,导致日志显示不全

INFO20221117.112041.606341 TID:d0ca49fe66297bc6 [middlewares/http_logger.go/Mylogger line:41] Start Request proto=HTTP/1.1|method=POST|ip=172.16.2.28|uri=/recommma/v1/triggering|queryString=|header=map[Accept:[*/*] Accept-Encoding:[gzip, deflate, br] Connection:[keep-alive] Content-Length:[110] Content-Type:[application/json] Postman-Token:[43420baad5f4df] User-Agent:[PostmanRuntime/7.29.2]]|body= {^M
    "productId": 521,^M
    "entityTyp": 1,^M
    "engineId": "zzz-33334",^M
    "uids": ["12","13","14"]^M
 }

再描述下 我们这边ELK架构:

filebeat kafka logstash es 从日志收集内容,输出到kafka logstash消费kafka队列消息 logstash将过滤后的数据推送到es中 filebeat kafka logstash es

解决的话,2个方式:

方法1:修改filebeat配置

需要修改filebeat.yml 配置,具体的配置应该是 你配置的每个输入,
举例:

- type: filestream
  id: recommend-manage
  paths:
    - /usr/local/code/recommend-manage/logs/*
  rotation.external.strategy.copytruncate:
    suffix_regex: \.\d{8}$
    dateformat: -20060102
  fields:
    service_name: recommend-manage
  parsers:
    - multiline:
        type: pattern
        pattern: '[\S]*.*([0-9]{8}\.[0-9]{6}\.*[0-9]{0,6})+.*'
        negate: true
        match: after

parsers:
- multiline:
type: pattern 使用正则表达式
pattern: ‘[\S].([0-9]{8}.[0-9]{6}.[0-9]{0,6})+.正则表达式规则(根据需要自己修改)
negate: true 匹配正则表达式
match: after 把下一行不符合匹配规则的内容进行合并

还有些 其他参数,可以参考官方文档

优点: 从日志源头就合并好了数据,这样无论是 filebeat 增加字段,或者 logstash中过滤规则,都不会对此造成影响
缺点: 每个input 日志都需要单独配置(目前我还没有找到可以全局配置的)

参考:

  1. https://www.elastic.co/guide/en/beats/filebeat/8.5/filebeat-input-filestream.html#filebeat-input-filestream-common-options

方法2:修改logstash配置

需要修改logstash配置文件
举例:

filter {
    ......
    multiline {
              pattern => "[\S]*.*([0-9]{8}\.[0-9]{6}\.*[0-9]{0,6})+.* "  ## 匹配一定包含有日期格式的内容
              negate => true                       ## 正则匹配成功
              what => "previous"                   ## 对下一个匹配出现前的内容进行合并
        }
}

优点:: 只需要在logstash配置1处就行,方便
缺点:: 一但filebeat上报日志时,增加了特殊字段,那么这里合并时,也会把内容都写进去,无法过滤掉filebeat中增加的字段内容

参考:

  1. https://www.codenong.com/cs106014866/
  2. https://blog.51cto.com/morrowind/2115129
  3. https://www.elastic.co/guide/en/logstash/7.15/plugins-codecs-multiline.html

有关logstash 和 filebeat多行日志 合并的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  2. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  4. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

  5. ruby - Sinatra 中的全局救援和日志记录异常 - 2

    如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si

  6. ruby-on-rails - 使用 Ruby 标准 Logger 每天只创建一个日志 - 2

    我正在使用ruby​​标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log

  7. ruby - Cucumber/Savon 省略或删除日志输出 - 2

    在运行Cucumber测试时,我得到(除了测试结果)大量调试/日志相关的输出形式:D,[2013-03-06T12:21:38.911829#49031]DEBUG--:SOAPrequest:D,[2013-03-06T12:21:38.911919#49031]DEBUG--:Pragma:no-cache,SOAPAction:"",Content-Type:text/xml;charset=UTF-8,Content-Length:1592W,[2013-03-06T12:21:38.912360#49031]WARN--:HTTPIexecutesHTTPPOSTusingt

  8. ruby-on-rails - faraday如何设置日志级别 - 2

    我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada

  9. ruby - Sublime Text 3 多行法折叠 - 2

    所以...SublimeText具有折叠方法的内置功能,但是一旦方法声明跨越多行,它就会失去这种能力。有谁知道插件或使它工作的方法吗?具体来说,我在使用ruby​​时遇到了这个问题(我的团队遵守关于行长度的严格风格指南),但语言应该无关紧要。 最佳答案 无需单击出现在函数定义第一行旁边的装订线中的向下箭头,您需要做的就是将光标放在函数的一个缩进行上(不是缩进的函数参数,而是在函数定义本身)并使用CtrlShift[键绑定(bind)(在OSX上使用⌘Alt[)折叠函数及其参数。使用CtrlShift](⌘Alt]在OSX上)展开,或

  10. ruby-on-rails - Logstash 可以在 Rails 上使用 Ruby 吗? - 2

    有没有人得到Logstash在Rails上使用ruby​​?我的客户告诉我将Logstash用于日志收集器等。我正在使用ruby​​onrails技术。大部分都快完成了。但要求是将日志记录到logstash中。请让我知道这可能吗? 最佳答案 我为此编写了一个gem-logstasher.它将Rails日志写入一个单独的文件,采用纯json格式,无需任何处理即可由logstash使用。查看我的blog有关如何设置Logstash和Kibana的完整说明 关于ruby-on-rails-Lo

随机推荐