zoukankan      html  css  js  c++  java
  • 第七章 Logstash深入-收集java日志

    通过Logstash收集java日志并输出到ES中

    因为我们现在需要用Logstash收集tomcat日志,所以我们暂时将tomcat安装到Logstash所在机器,也就是db03:10.0.0.53这台机器,收集tomcat访问日志以及tomcat错误日志进行实时统计,在企业中,tomcat机器肯定不是单台,而是一个集群的形式,那么我们每台tomcat上都需要安装一个Logstash,然后将收集到的日志输出给Elasticsearch进行分析。


    将tomcat日志改成json格式

    在企业中,我们看到tomcat日志遇到异常(exception)一条日志可能是几行或者十几行甚至几十行,组成的,那么,我们需要将多行日志变成一行日志,来收集。

    这里我们有几种方式可以实现:
    1.将日志改成Json格式
    在企业中,想要将java日志改成json格式,并没有那么容易。
    格式不是你想改,想改就能改,让我挣开,让我明白,放手你的爱~~~~
    因为将日志改成Json格式,查看起来会很难受,有些开发人员不希望将日志格式改成Json的,所以,在改日志格式之前需要跟开发人员进行沟通,那么将tomcat日志格式改成Json格式也有两种方式。
    1)开发自己更改,通过程序代码,或者log4j
    2)运维修改tomcat的server配置文件

    #编辑tomcat配置文件
    [root@elkstack03 ~]# vim conf/server.xml
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="tomcat_access_log" suffix=".log"
                   pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/> 
    

    2.通过Logstash其他模块来收集例:multiline多行匹配

    以下是tomcat日志文件中exception展示


    安装tomcat

    安装JDK环境

    下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    #解压JDK安装包
    [root@elkstack03 ~]# tar xf jdk-8u121-linux-x64.tar.gz
    #将JDK安装包移动到安装目录下
    [root@elkstack03 ~]# mv jdk1.8.0_121 /usr/local/
    #做软链接(方便日后升级)
    [root@elkstack03 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8
    #添加环境变量
    [root@elkstack03 ~]# vim /etc/profile.d/jdk1.8.sh
    export JAVA_HOME=/usr/local/jdk1.8
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    #加载环境变量
    [root@elkstack03 ~]# source /etc/profile
    #检查是否加载成功
    [root@elkstack03 ~]# java -version
    java version "1.8.0_121"
    Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
    

    安装tomcat

    #解压tomcat安装包
    [root@elkstack03 ~]# tar xf apache-tomcat-8.0.38.tar.gz
    #将安装包移动到安装路径并改名
    [root@elkstack03 ~]# mv apache-tomcat-8.0.38 /usr/local/tomcat-8.0.38
    #做软链接
    [root@elkstack03 ~]# ln -s /usr/local/tomcat-8.0.38 /usr/local/tomcat
    #进入tomcat站点目录
    [root@elkstack03 ~]# cd /usr/local/tomcat/webapps/
    #创建新项目目录
    [root@elkstack03 webapps]# mkdir webdir
    #写一个测试页面到站点目录下的index.html文件中
    [root@elkstack03 webapps]# echo 'zls tomcat page' > webdir/index.html
    #进入tomcat程序目录
    [root@elkstack03 webapps]# cd /usr/local/tomcat/bin/
    #启动tomcat
    [root@elkstack03 bin]# ./catalina.sh start
    #检测tomcat端口是否启动
    [root@elkstack03 bin]# netstat -lntup|grep 8080
    tcp        0      0 :::8080                     :::*                        LISTEN      12569/java
    

    启动成功后,打开浏览器,访问:http://10.0.0.53:8080/webdir/


    修改tomcat日志格式
    #进入tomcat配置文件目录
    [root@elkstack03 ~]# cd /usr/local/tomcat/conf
    #编辑server配置文件
    [root@elkstack03 conf]# vim server.xml
    #在138行,添加如下内容
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="tomcat_access_log" suffix=".log"
                   pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/> 
    #进入tomcat程序目录
    [root@elkstack03 conf]# cd /usr/local/tomcat/bin/
    #停止tomcat
    [root@elkstack03 bin]# ./catalina.sh stop
    #启动tomcat
    [root@elkstack03 bin]# ./catalina.sh start
    #进入tomcat日志目录
    [root@elkstack03 bin]# cd /usr/local/tomcat/logs/
    #查看新生成的tomcat日志
    [root@elkstack03 logs]# ll
    总用量 40
    -rw-r--r-- 1 root root 14601 3月  31 10:10 tomcat_access_log.2019-03-31.log
    #实时跟进日志
    [root@elkstack03 logs]# tail -f tomcat_access_log.2019-03-31.log
    

    打开浏览器,访问:http://10.0.0.53:8080/webdir/


    验证Json格式

    复制一条日志,打开浏览器,访问:http://www.kjson.com/


    配置Logstash收集tomcat日志输出到ES中
    #进入Logstash配置文件目录
    [root@elkstack03 logs]# cd /etc/logstash/conf.d/
    #编辑Logstash配置文件
    [root@elkstack03 conf.d]# vim tomcat_es.conf
    #输入插件
    input {
    #文件模块
      file {
    #文件路径
        path => "/usr/local/tomcat/logs/tomcat_access_log.2019-03-31.log"
    #从结束位置点开始收集
        start_position => "end"
    #日志类型
        type => "tomct_access_log"
      }
    }
    #输出插件
    output {
    #ES模块
        elasticsearch {
    #主机信息
          hosts => ["10.0.0.51:9200"]
    #索引名称,也就是日志名称
          index => "tomcat_access-%{+YYYY.MM.dd}"
    #输出成json格式
          codec => "json"
      }
    }
    #启动Logstash
    [root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tomcat_es.conf &
    

    启动成功,如下图所示:

    打开浏览器,访问:http://10.0.0.51:9100/ 查看是否生成日志,如果没有,则访问tomcat页面。


    使用multiline插件收集java日志

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并,https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

    因为目前tomcat日志中没有exception,所以,我们把Logstash部署在ES上,收集一下ES的java日志。

    安装JDK环境

    下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    #解压JDK安装包
    [root@elkstack01 ~]# tar xf jdk-8u121-linux-x64.tar.gz
    #将JDK安装包移动到安装目录下
    [root@elkstack01 ~]# mv jdk1.8.0_121 /usr/local/
    #做软链接(方便日后升级)
    [root@elkstack01 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8
    #添加环境变量
    [root@elkstack01 ~]# vim /etc/profile.d/jdk1.8.sh
    export JAVA_HOME=/usr/local/jdk1.8
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
    #加载环境变量
    [root@elkstack01 ~]# source /etc/profile
    #检查是否加载成功
    [root@elkstack01 ~]# java -version
    java version "1.8.0_121"
    Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
    

    安装Logstash

    下载地址: https://www.elastic.co/downloads/past-releases/logstash-5-3-0

    #安装Logstash使用yum localinstall 自动安装依赖包
    [root@elkstack03 ~]# yum localinstall -y logstash-5.3.0.rpm
    #给Logstash目录授权
    [root@elkstack03 ~]# chown -R logstash.logstash /usr/share/logstash/
    

    测试标准输入标准输出多行匹配
    #编辑Logstash配置文件
    [root@elkstack03 ~]# vim /etc/logstash/conf.d/java.conf
    input {
            stdin {
            codec => multiline {
    #当遇到[开头的行时候将多行进行合并
            pattern => "^["
    #true为匹配成功进行操作,false为不成功进行操作
            negate => true
    #与上面的行合并,如果是下面的行合并就是next
            what => "previous"
            }}
    }
    output {
            stdout {
            codec => rubydebug
            }
    }
    #测试多行匹配数据
    [root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/java.conf
    


    测试将日志写入到文件中
    [root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_file.conf
    input {
      file {
        path => "/data/elk/logs/elk-cluster.log"
        type => "es-log"
        start_position => "beginning"
        codec => multiline {
        pattern => "^["
        negate => true
        what => "previous"
      }}
    }
    
    output {
       file {
        path =>  "/tmp/es_log.txt"
       }
    }
    #启动Logstash
    [root@elkstack01 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_file.conf &
    


    将结果输出到ES中
    #编写Logstash配置文件
    [root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_es.conf
    input {
      file {
        path => "/data/elk/logs/elk-cluster.log"
        type => "es-log"
        start_position => "beginning"
        codec => multiline {
        pattern => "^["
        negate => true
        what => "previous"
      }}
    }
    output {
      elasticsearch {
        hosts =>  ["10.0.0.51:9200"]
        index => "es_log_%{+YYYY.MM.dd}"
      }
    }
    #启动Logstash
    [root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_es.conf &
    

    打开浏览器,访问:http://10.0.0.51:9100/

  • 相关阅读:
    css如何去掉select原始样式
    Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL
    eclispe+maven+ssm+sql_server/mysql配置
    解决Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0问题
    eclipse alt+/智能提示错误问题
    去除input边框 input去除边框 去除input获取焦点时的蓝色外边框
    java对sql server的增删改查
    java连接sql server 2008
    卸载sql server 2008
    FTP的vsftpd.conf含义
  • 原文地址:https://www.cnblogs.com/martin-wang/p/10656693.html
Copyright © 2011-2022 走看看