程序运行避免不了出错,测试环境时我们可以通过打断点定位问题。但是上线之后的项目出bug,进行定位时就需要查看日志。spring cloud进行分布式部署后会有多个微服务,每个微服务都会产生日志,怎么进行日志分类,按条件索引想要看到的报错内容呢?现在流行的日志监控系统ELK完美解决这个问题。本文整理了ELK单机版在Linux系统进行搭建,以及springboot将日志关联到ELK系统。
ELK是由三个工具整合的日志系统(elasticsearch、logstash、kibana)。
Elasticsearch:起到的作用是日志索引,快速根据不同条件找到我们想看到的日志。
Logstash:起到的作用是日志收集,各个微服务将日志关联到logstash。
kibana:起到的作用是可视化UI界面。查看日志总归是有个图形化界面比较好看实用。
一 、安装Elasticsearch
- 下载,我用的6.4.1版本,新版本没用过,也没了解有啥变化,还是稳重求胜比较好。下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-4-1
- 解压缩:
tar -zxvf elasticsearch-6.4.1.tar.gz -C /usr/local
这时,/usr/local目录下就有elasticsearch-6.4.1目录了
cd /usr/local/ elasticsearch-6.4.1
3. 编辑配置文件并启动
vi /config/elasticsearch.yml 修改基本配置(注意的点,:后面跟一个空格。它是yml格式的文件)
network.host: 192.168.0.85 单机配置成本机地址即可
http.port: 9200 端口默认9200
这时就配置完成,但是它不允许root运行,所以我们新建个帐号来运行它
useradd elk
passwd elk
输入俩次密码 回到上级目录并更改elasticsearch的拥有者:
chown -R elk elasticsearch-6.4.1
这时切换到elk用户,执行
su elk
命令完成切换
cd elasticsearch-6.4.1
后台运行它,并将启动日志输入
nohup ./bin/elasticsearch &
查看elasticsearch运行日志命令
vi nohup.out 查看截至到当前日志
tailf nohup.out 实时查看运行日志
二 、安装Logstash
- 下载,我用的6.4.1版本,新版本没用过,也没了解有啥变化,还是稳重求胜比较好。下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-6-4-1
- 解压缩:
tar -zxvf logstash-6.4.1.tar.gz -C /usr/local
cd /usr/local/logstash-6.4.1/
3. 编辑配置文件并启动
创建一个配置文件
vi config/logstash.conf (logstash.conf 名字可自定义)
以下为logstash中基本配置:
input {
tcp {
port => "5044"
codec => "json"
}
}
output {
elasticsearch {
action => "index"
hosts => ["192.168.195.201:9200"]
index => "%{[appname]}"
}
}
启动logstash
nohup ./bin/logstash -f ./config/logstash.conf &
查看logstash运行日志命令
vi nohup.out 查看截至到当前日志
tailf nohup.out 实时查看运行日志
三 、安装Kibana
- 下载,我用的6.4.1版本,新版本没用过,也没了解有啥变化,还是稳重求胜比较好。下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-6-4-1
- 解压缩:
tar -zxvf kibana-6.4.1-linux-x86_64.tar.gz -C /usr/local/
3. 编辑配置文件并启动
cd /usr/local/kibna-6.4.10linux-x86_64
vi config/kibana.yml
下边为kinaka中需要配置的
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.0.85:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "changeme"
启动kibana
nohup ./bin/kibana &
查看kibana运行日志命令
vi nohup.out 查看截至到当前日志
tailf nohup.out 实时查看运行日志
四、springboot中关联Logstash日志
logback.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true"
scanPeriod="1 seconds">
<include
resource="org/springframework/boot/logging/logback/base.xml" />
<!-- <jmxConfigurator/> -->
<contextName>logback</contextName>
<property name="log.path" value="/home/xxx.log" /> <!--存储日志到服务器路径配置 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID} --- [%15.15t] %-40.40logger{39} : %m%n" />
<!--输出到控制台 -->
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!--下边socket关联logstash -->
<appender name="socket"
class="net.logstash.logback.appender.LogstashSocketAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<host>192.168.0.85</host>
<port>5044</port>
<customFields>{"appname":"appname"}</customFields>
</appender>
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.0.85:5044</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"appname"}</customFields>
</encoder>
<connectionStrategy>
<roundRobin>
<connectionTTL>5 minutes</connectionTTL>
</roundRobin>
</connectionStrategy>
</appender>
<root level="info">
<!-- <appender-ref ref="file" /> -->
<appender-ref ref="socket" />
<appender-ref ref="LOGSTASH" />
</root>
</configuration>