Docker搭建ELK日志系统及logback.xml日志采集

·  阅读 444
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的数据通过友好的页面展示出来,提供实时分析的功能。

架构

5ec5e3e6f348b3e9746af6b042ec55f

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":"guilin"}</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>

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

## 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的详细配置请看[官方文档](https://www.elastic.co/guide/en/logstash/current/index.html)

运行容器
```
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":"guilin"}</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>

```
复制代码
分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改