以下配置是logstash切分tomcat catalina.out日志。

http://grok.qiexun.net/  分割时先用这个网站测试下语句对不对,能不能按需切割日志。

 input {
   file {
     type => "01-catalina"
     path => ["/usr/local/tomcat-1/logs/catalina.out"]
     start_position => "beginning"
     ignore_older =>
     codec=> multiline {
       pattern => "^2018"
       negate => true
       what => "previous"
             }
     }

   file {
     type => "02-catalina"
     path => ["/usr/local/tomcat-2/logs/catalina.out"]
     start_position => "beginning"
     ignore_older =>
     codec=> multiline {
       pattern => "^2018"
       negate => true
       what => "previous"
             }
     }

 }

 filter {
   grok {
   match => {
     "message" => "%{DATESTAMP:date} \|-%{LOGLEVEL:level} \[%{DATA:class}\] %{DATA:code_info} -\| %{GREEDYDATA:log_info}"
       }
     }
   }

 output {
   elasticsearch {
     hosts => ["192.168.1.1:9200"]
     index => "tomcat-%{type}"
         }
 stdout {
   codec => rubydebug
    }
   }

跨行匹配  比如java 堆栈信息

 input {
     file {
         type => "10.139.32.68"
         path => ["/data1/application/api/apache-tomcat/logs/catalina.out"]
         start_position => "beginning"
         ignore_older =>
         codec=> multiline {
               pattern => "^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
               negate => true
               what => "previous"
                 }
         }
codec=> multiline 引用 multiline插件
pattern  正则匹配  ^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}  表示以 2018-10-10 10:10:10 日期形式开通的negate what  值为previous 表示未匹配的内容属于上一个匹配内容

自定义正则表达式

其中(?<>())格式表示一个正则开始,<>里是正则匹配名,()里是正则表达式

上图正则分四段,分别是

(?<date>(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}))   匹配日期

\s{1,2}   匹配1或2个空格

(?<loglevel>(\w{4,5}))  匹配4或5个字母

(?<log_info>(.*))   匹配所有字符

又如下面这个

2019-01-04 17:29:56.479 |-ERROR 31593 --- [DubboServerHandler-10.139.32.94:20885-thread-50] c.v.g.risk.service.CreditReportService   : shuJuMoHeMessage TelRelativize error_null

%{DATESTAMP:date} \|-%{LOGLEVEL:level} \d{3,5} --- (?<xxx>(\[\w+-\d+.\d+.\d+.\d+:\d+-\w+-\d+\])) (?<file>(\S+))\s+: %{GREEDYDATA:log_info}

logstash 启动多个配置文件
logstash 启动多个配置文件,比如conf目录下有cs.conf和server.conf就可以用下面命令启动./logstash -f ../conf/ 记住conf后面不能加上*  如./logstash -f ../conf/* ,这样只会读取conf目录下的一个配置文件。
另外虽然可以同时启动多个配置文件,但实际上是把多个配置文件拼接成一个的配置文件的,也就是多个配置文件里的input、filter、output不是相互独立的。如有俩个配置文件cs.conf和server.conf 配置如下:
 cs.conf配置: 1 input {
     file {
         type => "192.168.1.1"
         path => ["/data1/application/cs/tomcat-1/logs/catalina.out"]
         start_position => "beginning"
         ignore_older =>
         codec=> multiline {
               pattern => "^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
               negate => true
               what => "previous"
                 }
         }

 }

 filter {
         grok {        remove_tag => ["multiline"]  #打印多行时有时会无法解析,因为tags里会多出一个multiline ,进而报错,报错信息如文末备注1
 match =>          hosts => [ index =>    codec =>  }
server.conf配置 1 input {
     file {
         type => "192.168.1.1"
         path => ["/data1/application/server/tomcat-2/logs/catalina.out"]
         start_position => "beginning"
         ignore_older =>
         codec=> multiline {
               pattern => "^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
               negate => true
               what => "previous"
                 }
         }

 }

 filter {
         grok {
         match => {
            "message" => "%{DATESTAMP:date} \|-%{LOGLEVEL:level} %{GREEDYDATA:log_info}"
         }
   }
 }

 output {
     elasticsearch {
         hosts => ["192.168.0.1:9200"]
         index => "qwe-server-tomcat"
     }
     stdout {
         codec => rubydebug
     }
 } 

上面俩个配置就算同时启动,但实际上俩个配置文件会拼接成一个,input里的内容会输出俩个,导致elk里数据看起来是重复的,打印了俩次


一般这种情况建议,input里建议使用tags或者type这两个特殊字段,即在读取文件的时候,添加标识符在tags中或者定义type变量。如下面这种
 input {
     file {
         type => "192.168.1.1"
         tags =>"cs"
         path => ["/data1/application/cs/tomcat-1/logs/catalina.out"]
         start_position => "beginning"
         ignore_older =>
         codec=> multiline {
               pattern => "^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
               negate => true
               what => "previous"
                 }
         }

     file {
         type => "192.168.1.1"
         tags =>"server"
         path => ["/data1/application/server/tomcat-2/logs/catalina.out"]
         start_position => "beginning"
         ignore_older =>
         codec=> multiline {
               pattern => "^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"
               negate => true
               what => "previous"
                 }
         }

 }

 filter {
         grok {           remove_tag =>["multiline"]
         match => {
            "message" => "%{DATESTAMP:date} \|-%{LOGLEVEL:level} %{GREEDYDATA:log_info}"
         }
   }
 }

 output {
     elasticsearch {
         hosts => ["192.168.0.1:9200"]
         index => "ulh-%{tags}-tomcat"
     }
     stdout {
         codec => rubydebug
     }
 }

这样我们就可以根据tpye和tags分别日志是哪台服务器上的哪个应用了

注1:跨行解析时因为多个tags导致无法解析异常的截图,解决方法就是在 filter  grok里添加 remove_tag =>["multiline"]

注2:logstash中multiline更多用法

input {
    stdin {
        codec =>multiline {
            charset=>...          #可选     字符编码
            max_bytes=>...        #可选     bytes类型            设置最大的字节数
            max_lines=>...        #可选     number类型           设置最大的行数,默认是500行
            multiline_tag...      #可选     string类型           设置一个事件标签,默认是multiline
            pattern=>...          #必选     string类型           设置匹配的正则表达式
            patterns_dir=>...     #可选     array类型            可以设置多个正则表达式
            negate=>...           #可选     boolean类型          设置true是向前匹配,设置false向后匹配,默认是FALSE
            what=>...             #必选                         设置未匹配的内容是向前合并还是先后合并,previous,next两个值选择
        }
    }

}

 

logstash 切分tomcat日志的更多相关文章

  1. logstash采集tomcat日志、mysql错误日志

    input{ file { path => "/opt/Tomcat7.0.28/logs/*.txt" start_position => "beginni ...

  2. 构建Logstash+tomcat镜像(让logstash收集tomcat日志)

    1.首先pull logstash镜像作为父镜像(logstash的Dockerfile在最下面): 2.构建my-logstash镜像,使其在docker镜像实例化时,可以使用自定义的logstas ...

  3. logstash 处理tomcat日志

    [root@dr-mysql01 tomcat]# cat logstash_tomcat.conf input { file { type => "zj_api" path ...

  4. logstash配合filebeat监控tomcat日志

    环境:logstash版本:5.0.1&&filebeat 5.0.1 ABC为三台服务器.保证彼此tcp能够相互连接. Index服务器A - 接收BC两台服务器的tomcat日志 ...

  5. ELK对Tomcat日志双管齐下-告警触发/Kibana日志展示

    今天我们来聊一聊Tomcat,相信大家并不陌生,tomcat是一个免费开源的web应用服务器,属于轻量级的应用程序,在小型生产环境和并发不是很高的场景下被普遍使用,同时也是开发测试JSP程序的首选.也 ...

  6. ELK收集Nginx|Tomcat日志

    1.Nginx 日志收集,先安装Nginx cd /usr/local/logstash/config/etc/,创建如下配置文件,代码如下 Nginx.conf input { file { typ ...

  7. tomcat日志采集

    1. 采集tomcat确实比之前的需求复杂很多,我在搭建了一个tomcat的环境,然后产生如下报错先贴出来: Jan 05, 2017 10:53:35 AM org.apache.catalina. ...

  8. 4:ELK分析tomcat日志

    五.ELK分析tomcat日志 1.配置FIlebeat搜集tomcat日志 2.配置Logstash从filebeat输入tomcat日志 3.查看索引 4.创建索引

  9. log4j托管tomcat日志

    由于项目中 Tomcat 日志越来越大,对于日志查找非常不方便,所以经过一番调查可以通过log4j来托管 Tomcat 日志的方式,实现Tomcat日志切片.这里只说明怎么是log4j托管Tomcat ...

随机推荐

  1. win10 caffe GPU环境搭建

    一.准备 系统:win10 显卡:gtx1050Ti 前期的一些必要软件安装,包括python3.5.matlab2016.vs2015.git, 可参考:win10+vs2015编译caffe的cp ...

  2. GDI与GDI+性能比较

    编写程序对GDI和GDI+绘制进行了比较,经过比较,GDI相对GDI+还是有一些性能优势的. 同时比较了每次绘制创建TGPGraphics对象和共用一个TGPGraphics对象的情况,两者性能相差不 ...

  3. Sqlserver常用基础语句

    1. char/nchar,varchar/nvarchar char(10) 只能放五个中文,定长,如果只放一个字节,后面就是九个空格(一个中文两个字节) nchar(10) 放十个中文,定长 va ...

  4. 将centos的yum源修改为阿里云的yum源

    CentOS系统更换软件安装源 第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentO ...

  5. C# 重写Equals

    public class PerformanceRank { public int Rank { get; set; } public string Eid { get; set; } public ...

  6. 语音识别传统方法(GMM+HMM+NGRAM)概述

    春节后到现在近两个月了,没有更新博客,主要是因为工作的关注点正从传统语音(语音通信)转向智能语音(语音识别).部门起了个新项目,要用到语音识别(准备基于Kaldi来做).我们之前做的传统音频已基本成熟 ...

  7. 读完这一篇,字符串格式化界的“白富美”(f-strings)抱回家!

    f-strings 从Python 3.6开始,新引入了一种字符串格式化方法,称为“格式化字符串常量”(formatted string literal),简称f-strings.相比于%.str.f ...

  8. iview 3.x InputNumber数字框bug

    iview 3.X 版本中InputNumber 数字框组件存在bug,把最小值设置为0.2时,数组框禁止点击,其他数字都是正常.

  9. [UE4]让箭头保持水平

    如图所示,当手柄前后左右转动的时候,箭头也会跟着转动,我们的目标是要求箭头紧贴着地面,不会跟着手柄前后左右转动. 分析上图坐标系可以知道,只要让箭头绕着Z轴转动就可以了,不需要绕着X轴和Y轴旋转. 

  10. Android中刷新Invalidate和postInvalidate的区别

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.Android提供了Inval ...