#过年不停更# Docker搭建ELK日志系统及logback.xml日志采集 原创

新一代程序猿
发布于 2022-1-18 09:22
浏览
0收藏

春节不停更,此文正在参加「星光计划-春节更帖活动

概念

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。

架构

#过年不停更# Docker搭建ELK日志系统及logback.xml日志采集-鸿蒙开发者社区

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>

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 12:46:57修改
收藏
回复
举报
回复
    相关推荐