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 |
最终效果