你居然还去服务器上捞日志,搭个日志收集系统难道不香么!
优采云 发布时间: 2022-05-25 21:37你居然还去服务器上捞日志,搭个日志收集系统难道不香么!
ELK日志收集系统进阶使用,本文主要讲解如何打造一个线上环境真实可用的日志收集系统。有了它,你就可以和去服务器上捞日志说再见了!
ELK环境安装
ELK是指Elasticsearch、Kibana、Logstash这三种服务搭建的日志收集系统,具体搭建方式可以参考。这里仅提供最新版本的docker-compose脚本和一些安装要点。
docker-compose脚本
version: '3'<br />services:<br /> elasticsearch:<br /> image: elasticsearch:6.4.0<br /> container_name: elasticsearch<br /> environment:<br /> - "cluster.name=elasticsearch" #设置集群名称为elasticsearch<br /> - "discovery.type=single-node" #以单一节点模式启动<br /> - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小<br /> - TZ=Asia/Shanghai<br /> volumes:<br /> - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载<br /> - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载<br /> ports:<br /> - 9200:9200<br /> - 9300:9300<br /> kibana:<br /> image: kibana:6.4.0<br /> container_name: kibana<br /> links:<br /> - elasticsearch:es #可以用es这个域名访问elasticsearch服务<br /> depends_on:<br /> - elasticsearch #kibana在elasticsearch启动之后再启动<br /> environment:<br /> - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址<br /> - TZ=Asia/Shanghai<br /> ports:<br /> - 5601:5601<br /> logstash:<br /> image: logstash:6.4.0<br /> container_name: logstash<br /> environment:<br /> - TZ=Asia/Shanghai<br /> volumes:<br /> - /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件<br /> depends_on:<br /> - elasticsearch #kibana在elasticsearch启动之后再启动<br /> links:<br /> - elasticsearch:es #可以用es这个域名访问elasticsearch服务<br /> ports:<br /> - 4560:4560<br /> - 4561:4561<br /> - 4562:4562<br /> - 4563:4563<br />
安装要点
docker-compose up -d<br />
chmod 777 /mydata/elasticsearch/data/<br />
logstash-plugin install logstash-codec-json_lines<br />
分场景收集日志
这里为了方便我们查看日志,提出一个分场景收集日志的概念,把日志分为以下四种。
Logback配置详解
要实现上面的分场景收集日志,主要通过Logback的配置来实现,我们先来了解下Logback的配置吧!
完全配置
在SpringBoot中,如果我们想要自定义Logback的配置,需要自行编写logback-spring.xml文件,下面是我们这次要使用的完全配置。
<br /><br /><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> DEBUG<br /> <br /> <br /> <br /> ${FILE_LOG_PATTERN}<br /> UTF-8<br /> <br /> <br /> <br /> ${LOG_FILE_PATH}/debug/${APP_NAME}-%d{yyyy-MM-dd}-%i.log<br /> <br /> ${LOG_FILE_MAX_SIZE:-10MB}<br /> <br /> ${LOG_FILE_MAX_HISTORY:-30}<br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> ERROR<br /> ACCEPT<br /> DENY<br /> <br /> <br /> <br /> ${FILE_LOG_PATTERN}<br /> UTF-8<br /> <br /> <br /> <br /> ${LOG_FILE_PATH}/error/${APP_NAME}-%d{yyyy-MM-dd}-%i.log<br /> <br /> ${LOG_FILE_MAX_SIZE:-10MB}<br /> <br /> ${LOG_FILE_MAX_HISTORY:-30}<br /> <br /> <br /><br /> <br /> <br /> <br /> DEBUG<br /> <br /> ${LOG_STASH_HOST}:4560<br /> <br /> <br /> <br /> Asia/Shanghai<br /> <br /> <br /> <br /> <br /> {<br /> "project": "mall-tiny",<br /> "level": "%level",<br /> "service": "${APP_NAME:-}",<br /> "pid": "${PID:-}",<br /> "thread": "%thread",<br /> "class": "%logger",<br /> "message": "%message",<br /> "stack_trace": "%exception{20}"<br /> }<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 5 minutes<br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> ERROR<br /> ACCEPT<br /> DENY<br /> <br /> ${LOG_STASH_HOST}:4561<br /> <br /> <br /> <br /> Asia/Shanghai<br /> <br /> <br /> <br /> <br /> {<br /> "project": "mall-tiny",<br /> "level": "%level",<br /> "service": "${APP_NAME:-}",<br /> "pid": "${PID:-}",<br /> "thread": "%thread",<br /> "class": "%logger",<br /> "message": "%message",<br /> "stack_trace": "%exception{20}"<br /> }<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 5 minutes<br /> <br /> <br /> <br /><br /> <br /> <br /> ${LOG_STASH_HOST}:4562<br /> <br /> <br /> <br /> Asia/Shanghai<br /> <br /> <br /> <br /> <br /> {<br /> "project": "mall-tiny",<br /> "level": "%level",<br /> "service": "${APP_NAME:-}",<br /> "pid": "${PID:-}",<br /> "thread": "%thread",<br /> "class": "%logger",<br /> "message": "%message",<br /> "stack_trace": "%exception{20}"<br /> }<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 5 minutes<br /> <br /> <br /> <br /><br /> <br /> <br /> ${LOG_STASH_HOST}:4563<br /> <br /> <br /> <br /> Asia/Shanghai<br /> <br /> <br /> <br /> <br /> {<br /> "project": "mall-tiny",<br /> "level": "%level",<br /> "service": "${APP_NAME:-}",<br /> "class": "%logger",<br /> "message": "%message"<br /> }<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 5 minutes<br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><br /> <br /> <br /> <br /><br /> <br /> <br /> <br /><br />
配置要点解析使用默认的日志配置
一般我们不需要自定义控制台输出,可以采用默认配置,具体配置参考console-appender.xml,该文件在spring-boot-${version}.jar下面。
<br /><br /><br /><br />
springProperty
该标签可以从SpringBoot的配置文件中获取配置属性,比如说在不同环境下我们的Logstash服务地址是不一样的,我们就可以把该地址定义在application.yml来使用。
例如在application-dev.yml中定义了这些属性:
logstash:<br /> host: localhost<br />
在logback-spring.xml中就可以直接这样使用:
<br /><br /><br /><br />
filter
在Logback中有两种不同的过滤器,用来过滤日志输出。
ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志,比如下面的配置将过滤掉所有低于INFO级别的日志。
<br /> INFO<br /><br />
LevelFilter:级别过滤器,根据日志级别进行过滤,比如下面的配置将过滤掉所有非ERROR级别的日志。
<br /> ERROR<br /> ACCEPT<br /> DENY<br /><br />
appender
Appender可以用来控制日志的输出形式,主要有下面三种。
<br /> <br /> ${CONSOLE_LOG_PATTERN}<br /> <br /><br />
<br /><br /> <br /> <br /> ${LOG_FILE_PATH}/error/${APP_NAME}-%d{yyyy-MM-dd}-%i.log<br /> <br /> ${LOG_FILE_MAX_SIZE:-10MB}<br /> <br /> ${LOG_FILE_MAX_HISTORY:-30}<br /> <br /><br />
<br /><br /> ${LOG_STASH_HOST}:4561<br /> <br /> <br /> <br /> Asia/Shanghai<br /> <br /> <br /> <br /> <br /> {<br /> "project": "mall-tiny",<br /> "level": "%level",<br /> "service": "${APP_NAME:-}",<br /> "pid": "${PID:-}",<br /> "thread": "%thread",<br /> "class": "%logger",<br /> "message": "%message",<br /> "stack_trace": "%exception{20}"<br /> }<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 5 minutes<br /> <br /> <br /><br />
logger
只有配置到logger节点上的appender才会被使用,logger用于配置哪种条件下的日志被打印,root是一种特殊的appender,下面介绍下日志划分的条件。
控制框架输出日志
还有一些使用框架内部的日志,DEBUG级别的日志对我们并没有啥用处,都可以设置为了INFO以上级别。
<br /><br /><br /><br /><br /><br />
Logstash配置详解
接下来我们需要配置下Logstash,让它可以分场景收集不同的日志,下面详细介绍下使用到的配置。
完全配置
input {<br /> tcp {<br /> mode => "server"<br /> host => "0.0.0.0"<br /> port => 4560<br /> codec => json_lines<br /> type => "debug"<br /> }<br /> tcp {<br /> mode => "server"<br /> host => "0.0.0.0"<br /> port => 4561<br /> codec => json_lines<br /> type => "error"<br /> }<br /> tcp {<br /> mode => "server"<br /> host => "0.0.0.0"<br /> port => 4562<br /> codec => json_lines<br /> type => "business"<br /> }<br /> tcp {<br /> mode => "server"<br /> host => "0.0.0.0"<br /> port => 4563<br /> codec => json_lines<br /> type => "record"<br /> }<br />}<br />filter{<br /> if [type] == "record" {<br /> mutate {<br /> remove_field => "port"<br /> remove_field => "host"<br /> remove_field => "@version"<br /> }<br /> json {<br /> source => "message"<br /> remove_field => ["message"]<br /> }<br /> }<br />}<br />output {<br /> elasticsearch {<br /> hosts => ["es:9200"]<br /> action => "index"<br /> codec => json<br /> index => "mall-tiny-%{type}-%{+YYYY.MM.dd}"<br /> template_name => "mall-tiny"<br /> }<br />}<br />
配置要点SpringBoot配置
在SpringBoot中的配置可以直接用来覆盖Logback中的配置,比如logging.level.root就可以覆盖节点中的level配置。
logstash:<br /> host: localhost<br />logging:<br /> level:<br /> root: debug<br />
logstash:<br /> host: 192.168.3.101<br />logging:<br /> level:<br /> root: debug<br />
Kibana进阶使用
进过上面ELK环境的搭建和配置以后,我们的日志收集系统终于可以用起来了,下面介绍下在Kibana中的使用技巧!
项目源码地址