去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易。 这篇文章主要介绍ELK最新版本的搭建,二方包的介绍可以看小霸王的另外一篇文章。
首先在linux虚拟机上安装docker 先卸载旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
升级yum
yum update
设置仓库
yum install -y yum-utils device-mapper-persistent-data lvm2
使用阿里云镜像地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine-Community
sudo yum install docker-ce docker-ce-cli containerd.io
设置docker开机启动并启动docker
sudo systemctl enable dockersudo systemctl start docker
sudo systemctl enable docker
sudo systemctl start docker
至此,docker已安装完成,可以使用docker -v查看版本,接下来就要安装三大金刚了
docker pull elasticsearch:8.6.2docker pull kibana:8.6.2docker pull logstash:8.6.2
docker pull elasticsearch:8.6.2
docker pull kibana:8.6.2
docker pull logstash:8.6.2
接着先挂载elasticsearch的配置文件,方便以后修改 首先创建elasticsearch.yml文件
cluster.name: "docker-cluster"network.host: 0.0.0.0discovery.seed_hosts: 0.0.0.0network.bind_host: 0.0.0.0http.port: 9200# Enable security featuresxpack.security.enabled: falsexpack.security.enrollment.enabled: false# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agentsxpack.security.http.ssl: enabled: false# Enable encryption and mutual authentication between cluster nodesxpack.security.transport.ssl: enabled: false
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.seed_hosts: 0.0.0.0
network.bind_host: 0.0.0.0
http.port: 9200
# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: false
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
创建elasticsearch容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" elasticsearch:8.6.2
启动elasticsearch容器
docker start elasticsearch
浏览器输入http://你的虚拟机ip:9200 显示如下,说明es启动成功
创建kibana容器,这里使用到汉化 "-e I18N_LOCALE=zh-CN"
docker run -d --name kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 kibana:8.6.2
启动kibana
docker start kibana
输入http://你的虚拟机ip:5601/ 此时kibana启动成功
在linux的/home目录下新建logstash.yml文件,其中index是索引的名称,我们使用“xiaobawang-”前缀加时间来生成每天的索引。
# 输入端input { stdin { } #为logstash增加tcp输入口,后面springboot接入会用到 tcp { mode => "server" host => "0.0.0.0" port => 5043 codec => json_lines }} #输出端output { stdout { codec => rubydebug } elasticsearch { hosts => ["http://你的虚拟机ip地址:9200"] # 输出至elasticsearch中的自定义index名称 index => "xiaobawang-%{+YYYY.MM.dd}" }}
# 输入端
input {
stdin { }
#为logstash增加tcp输入口,后面springboot接入会用到
tcp {
mode => "server"
host => "0.0.0.0"
port => 5043
codec => json_lines
}
#输出端
output {
stdout {
codec => rubydebug
elasticsearch {
hosts => ["http://你的虚拟机ip地址:9200"]
# 输出至elasticsearch中的自定义index名称
index => "xiaobawang-%{+YYYY.MM.dd}"
然后启动logstash,这里配置文件做了映射,/home/logstash.yml映射到/usr/share/logstash/pipeline/logstash.yml
docker run -d --name logstash -p 5043:5043 -p 5044:5044 --privileged=true -v /home/logstash.yml:/usr/share/logstash/pipeline/logstash.yml logstash:8.6.2
进入logstash容器
docker exec -it logstash /bin/bash
安装json_lines所需的插件
/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines
重启logstash,至此elk已全部安装完成了。
docker restart logstash
下面使用logstash来将日志发送到elasticsearch,这里以springboot为例。 新建一个springboot项目,引入如下包:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId></dependency><dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.3</version></dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version>
在resources文件夹下,创建logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration debug="false"> <!--获取springboot的yml配置信息--> <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="/home"/> <!--输出到控制台--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <withJansi>false</withJansi> <encoder> <!--<pattern>%d %p (%file:%line)- %m%n</pattern>--> <!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 日志发送至logstash --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- logstash的服务器地址和通信端口 --> <destination>你的虚拟机IP地址:5043</destination> <!-- encoder is required --> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 在elasticsearch的index中追加applicationName字段 --> <customFields>{"applicationName":"${applicationName}"}</customFields> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="logstash"/> <appender-ref ref="console"/> </root></configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--获取springboot的yml配置信息-->
<springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<withJansi>false</withJansi>
<encoder>
<!--<pattern>%d %p (%file:%line)- %m%n</pattern>-->
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志发送至logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash的服务器地址和通信端口 -->
<destination>你的虚拟机IP地址:5043</destination>
<!-- encoder is required -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 在elasticsearch的index中追加applicationName字段 -->
<customFields>{"applicationName":"${applicationName}"}</customFields>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="logstash"/>
<appender-ref ref="console"/>
</root>
</configuration>
新建一个controller请求
@RestControllerpublic class TestController { private final static Logger logger= LoggerFactory.getLogger(TestController.class); @RequestMapping("/myTest") public void test(){ logger.info("日志开始"+System.currentTimeMillis()); logger.info("日志结束"+System.currentTimeMillis()); }}
@RestController
public class TestController {
private final static Logger logger= LoggerFactory.getLogger(TestController.class);
@RequestMapping("/myTest")
public void test(){
logger.info("日志开始"+System.currentTimeMillis());
logger.info("日志结束"+System.currentTimeMillis());
访问完请求后,进入Stack Management找到索引管理
可以看到springboot的3月4号日志已经生成,下面进一步查看日志的内容。
点击左侧菜单,选择Discover,创建数据视图,因为索引名称前缀是xiaobawang-,所以索引模式填写xiaobawang-* 就可以匹配每天生成的日志。
至此,ELK已经搭建完成,但kibana的功能远远不限于此,还可以查看不同维度的数据视图报表,有兴趣的童鞋可以研究研究。觉得有用的话,一键三连~
原文链接:https://www.cnblogs.com/zhouxiaoben/p/17234464.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728