#过年不停更# Docker搭建ELK日志系统及logback.xml日志采集 原创
概念
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
架构
ELK镜像版本
elasticsearch:5.6.8
logstash:7.0.0
kibana:latest
1.拉取镜像:
docker pull elasticsearch:5.6.8
docker pull logstash:7.0.0
docker pull kibana:latest
2.安装elasticsearch:5.6.8
前期工作:
我们一共需要修改两处
修改/etc/security/limits.conf,追加内容
* soft nofile 65536
* hard nofile 65536
nofile是单个进程允许打开的最大文件个数
soft nofile 是软限制
hard nofile是硬限制
修改/etc/sysctl.conf,追加内容
vm.max_map_count=655360
限制一个进程可以拥有的VMA(虚拟内存区域)的数量
执行下面命令 修改内核参数马上生效
sysctl ‐p
新建一个elasticsearch文件夹
mkdir /root/elk/elasticsearch
启动一个elasticsearch
docker run --rm --name=test_es -itd -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
创建test_es实例的目的是为了获得 elasticsearch.yml
复制 elasticsearch.yml
dockers cp test_es:/usr/share/elasticsearch/config/elasticsearch.yml /root/elk/elasticsearch/elasticsearch.yml
停止test_es实例(在创建时加了 --rm 所以停止实例后会自动删除)
dokcer stop test_es
如果需要安装kibana等其他,需要创建一个网络,名字任意取,让他们在同一个网络,使得es和kibana通信
docker network create elk
运行容器
docker run -id --name elasticsearch --net elk --restart=always -p 9200:9200 -p 9300:9300 --hostname es -e "discovery.type=single-node" -v /root/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:5.6.8
个别参数解释
--hostname(可选):标志仅更改容器内的主机名.如果您的应用程序需要主机名的特定值,则可能需要这样做.它不会在docker之外更改DNS,也不会更改网络隔离,因此不允许其他人连接到具有该名称的容器.
--network 网络名用于多个服务通信与隔离,例如用kibana连接elasticsearch就需要他们在同一个网络下
2.安装logstash:7.0.0
运行容器:
docker run --rm --name test_logstash -d -p 5044:5044 -p 9600:9600 logstash:7.0.0
创建配置文件目录,设置权限:
mkidr -p /root/elk/logstash/config && \
chown -R 1000 /root/elk/logstash
拷贝配置文件:
docker cp logstash:/usr/share/logstash/config /root/elk/logstash/config
停止test_logstash 实例。(在创建时加了 --rm 所以停止实例后会自动删除)
dokcer stop test_logstash
修改/root/elk/logstash/config/logstash-sample.conf配置文件:
input {
tcp{
host=>"0.0.0.0"
port => 4560
codec=>json_lines
}
}
output {
elasticsearch {
hosts => ["http://es:9200"]
index => "bolg-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
该配置springboot通过logback可以完成日志收集
关于*.conf的详细配置请看官方文档
运行容器
docker run -id --name logstash --hostname logstash --net elk --restart=always -p 4560:4560 -p 9600:9600 -p 5044:5044 -v /root/elk/logstash/config:/usr/share/logstash/config -e xpack.monitoring.elasticsearch.hosts=http://es:9200 logstash:7.0.0 -f /usr/share/logstash/config/logstash-sample.conf
个别参数解释
-f 指定*.conf文件运行
-e xpack.monitoring.elasticsearch.hosts 设置elasticsearch的9200地址
3.安装Kibana 7.6.2
docker run -id --restart=always --name kibana --network=elk -p5601:5601 -e ELASTICSEARCH_URL=http://es:9200 kibana:latest
通过ip:5601就可以管理elasticsearch
SpringBoot通过logback完成日志收集
pom导入jar包
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.8</version>
</dependency>
<!--logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
修改resources下的logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* -->
<configuration scan="true" scanPeriod="60 seconds">
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 配置logstash的地址 -->
<destination>ip:4560</destination>
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"jackgreek"}</customFields>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="LOGSTASH" />
</root>
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="druid.sql" level="INFO"/>
<!-- MyBatis log configure -->
<logger name="com.apache.ibatis" level="INFO"/>
<logger name="org.mybatis.spring" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
</configuration>