ELK日志收集系统,收集springboot日志

Elasticsearch

ES单机安装教程:安装部署

SpringBoot log4j日志配置

项目中日志配置 和 打印示例

# lombok 打印
log.error("服务异常", e);
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30">

    <properties>
        <property name="LOG_HOME">/data</property>
        <property name="FILE_FOLDER">logs</property>
    </properties>

    <appenders>
        <!-- 输出控制台的配置 -->
        <console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{0} - %m%n"/>
        </console>
        <!-- 将日志输出到指定文件 fileName属性值为日志文件地址,具体的用RollingFile-->

        <RollingFile name="info" fileName="${LOG_HOME}/${FILE_FOLDER}/info.log"
                     filePattern="${LOG_HOME}/${FILE_FOLDER}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <!--如果是error级别拒绝,设置 onMismatch="NEUTRAL" 可以让日志经过后续的过滤器-->
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{0} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 保留5天日志 DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <RollingFile name="error" fileName="${LOG_HOME}/${FILE_FOLDER}/error.log"
                     filePattern="${LOG_HOME}/${FILE_FOLDER}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{0} - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <loggers>
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="error"/>
        </root>
    </loggers>
</configuration>

Filebeat

介绍

Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件,并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块auditd,Apache,Nginx,System和MySQL等,可通过一个指定命令来简化通用日志格式的收集,解析和可视化。

核心是按行读取文件,行偏移量以json格式保存的data下registry文件中 将读取到的每一行传输给logstash或者es,消息中间件等

配置

以下以收集springboot日志为例

filebeat.inputs:
- type: log
  paths:
    #设置要采集的文件 支持正则匹配多个文件
    - /data/logs/info.log
  # 增加字段 用于logstash区分是哪种日志
  #fields:
    #type: server
   # 处理java堆栈日志信息 合并成一行传输到logstash中 具体配置看官方文档
  multiline.pattern: '^\w*\.|^\\t|^[[:space:]]|^Caused by:'
  multiline.negate: false
  multiline.match: after
output.logstash:
  hosts: ["localhost:5044"]

启动命令:

nohup ./filebeat -e -c filebeat.yml -d "publish" &

多行配置正则描述:

正则描述
^\w*\.表示该行以字符串打头后面有点 即com.xxx
^\t表示该行以制表符打头
^[[:space:]]表示该行以空格打头
^Caused by:表示该行以Caused by:打头

以上符合条件的 都合并作为一行传输到logstash中,比如:

2021-09-25 05:41:22 [http-nio-8081-exec-9] ERROR HttpHelper - 服务异常
java.io.EOFException: Unexpected EOF read on the socket
        at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:734) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1061) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:245) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.coyote.Request.doRead(Request.java:551) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:318) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:611) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:341) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_202]
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_202]
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_202]
        at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_202]
        at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_202]
        at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_202]
        at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_202]

官方文档: filebeat 多行文本正则文档

Logstash

介绍

Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。

== Logstash 的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到 Elasticsearch ==

Logstash配置

input {
    beats {
    	# 对应上面filebeat设定的端口
        port => "5044"
        include_codec_tag => false
    }
}
filter {
   #if [fields][type] == "server"{
	   grok {
	        match => {
	            "message"=>"^(?<createTime>(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))%{SPACE}*\[%{DATA:threadName}\]%{SPACE}*%{LOGLEVEL:level}%{SPACE}*%{WORD:javaClass}%{SPACE}*-%{SPACE}*%{GREEDYDATA:msg}"
	        }
	        # 移除掉不需要的字段
	        remove_field => ["message","SPACE"]
	   }
  #}
}
output {
    # if [fields][type] == "server"{
	     elasticsearch {
	        hosts => [ "localhost:9200" ]
	        index => "server-log-%{+YYYY.MM.dd}"
	     }
   # }
}

保存文件到logstash目录下 文件名为pipeline.conf

启动命令

nohup ./bin/logstash -f pipeline.conf &

Grok

介绍

== grok是Logstash filter插件 作用是将日志处理解析,分析出多个字段,存入ES文档中 ==

参考文档

grok表达式校验网址
grok官方文档
grok表达式对应的正则

示例:

log4j日志格式如下

%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{0} - %m%n

对应grok解析表达式如下:

^(?<createTime>(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}))%{SPACE}*\[%{DATA:threadName}\]%{SPACE}*%{LOGLEVEL:level}%{SPACE}*%{WORD:javaClass}%{SPACE}*-%{SPACE}*%{GREEDYDATA:msg}
格式描述变量名
(?<createTime>(具体的正则表达式))表示自定义正则createTime
%{SPACE}*匹配一个或多个空格SPACE
[%{DATA:threadName}]大括号包起来的任意字符threadName
%{LOGLEVEL:level}等级level
%{WORD:javaClass}类名javaClass
%{GREEDYDATA:msg}任意字符msg

最终效果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值