vlambda博客
学习文章列表

ES系列十二之logback+ELK日志搭建




    

        哈喽大家好,今天呢,在出点干货吧。既然我们单点,集群都搞定了,那怎么运用我们的技术提高研发的效能呢?怎么提高大家在测试、预发、及生产上应对问题的效率呢?就是咱们今天的所说的elk了。


一、使用场景

      在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制。无论是开发人员还是运维人员都无法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。因此需要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展示,处理分析。ELK提供一套开源的解决方案,能高效、简便的满足以上场景。

二、ELK日志系统

1、ELK分别是Elasticsearch、Logstash、Kibana三个开源框架缩写。

ES系列十二之logback+ELK日志搭建


2、与Logstash的直接集成有两种方式:

2.1、Logstash与微服务应用安装在一起,监听日志文件

ES系列十二之logback+ELK日志搭建

2.2、Logstash独立部署,微服务节点通过网络向Logstash发送日志信息。

ES系列十二之logback+ELK日志搭建

3、间接集成(两种方式)

1、每个应用节点部署一个轻量级日志采集框架Beats,再由Beats对接统一的Logstash

    由于Logstash消耗资源大,而服务器资源相当宝贵,所以引进另一个轻量级日志采集框架Beats,其中包含以下6种

ES系列十二之logback+ELK日志搭建

ES系列十二之logback+ELK日志搭建

2、微服务将日志发送给Redis或者MQ,再由他们去对接Logstash(高并发场景)

        由于logstash消耗性能,所以高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,所以可以添加中间件进行日志缓存处理。由于logstash数据源具有多种方式,所有中间件也可以很多选择,常见的有kafka,redis。

ES系列十二之logback+ELK日志搭建

三、ELK搭建(非集群)

1、下载ELK(保持版本一致)

Elasticsearch 官网elasticsearch-6.3.1.tar(https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz es官方文档(https://www.elastic.co/cn/elasticsearch/
Kibana https://www.elastic.co/cn/downloads/past-releases/kibana-6-3-1 https://www.elastic.co/cn/kibana
Logstash https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz https://www.elastic.co/cn/logstash
Filebeat https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.1-linux-x86_64.tar.gz https://www.elastic.co/cn/beats/



下面只介绍,方案2:Logstash独立部署,微服务节点通过网络向Logstash发送日志信息。

2、环境准备

1、jdk1.8

2、Elasticsearch安装参考:

3、启动 Elasticsearch

3、安装Kibana

1、解压到安装目录即可

/home/kibana-6.3.1-linux-x86_64

2、修改配置文件

vi /home/kibana-6.3.1-linux-x86_64/config/kibana.yml
server.port: 5601 ##服务端口server.host: "0.0.0.0" ##服务器ip 本机elasticsearch.url: "http://localhost:9200" ##elasticsearch服务地址 与elasticsearch对应

3、启动kibana

/home/kibana-6.3.0-linux-x86_64/bin/kibana       #命令窗启动

4、关闭kibana

ps -ef | grep kibana #后台线程关闭kill -9 4525 ##pid 4525 为查处线程的pid

5、验证kibana启动

ES系列十二之logback+ELK日志搭建

4、安装logstash

1、下载

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gztar -zxvf logstash-6.3.1.tar.gz

2、创建配置文件logstash-es.conf

vim /home/logstash-6.3.1/conf.d/logstash-es.conf 

复制一下内容:

input { tcp { port => 10514 codec => "json" }}output { elasticsearch { action => "index" hosts => ["localhost:9200"] index => "%{[appname]}" }}

10514:接受日志端口

hosts => ["localhost:9200"]   :es的ip和端口

"%{[appname]}" :取值日志中appname值为索引

3、检测配置文件是否有错:

/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.conf--config.test_and_exitSending Logstash's logs to /var/log/logstash which is now configured via log4j2.propertiesConfiguration OK # 为ok则代表配置文件没有问题[root@data-node1 /usr/share/logstash/bin]#

命令说明:

  • --path.settings 用于指定logstash的配置文件所在的目录

  • -f 指定需要被检测的配置文件的路径

  • --config.test_and_exit 指定检测完之后就退出,不然就会直接启动了

4、指定配置文件,启动logstash:

/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.confSending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties# 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端

5、验证

打开新终端检查一下10514端口是否已被监听:

[root@data-node1 ~]# netstat -lntp |grep 10514tcp6 0 0 :::10514 :::* LISTEN 4312/java [root@data-node1 ~]#

5、配置lockback

1、maven

<!--logback日志--><dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>4.8</version></dependency>

2、logback.xml添加logstash配置

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><param name="Encoding" value="UTF-8"/><remoteHost>192.168.1.102</remoteHost><port>10514</port><!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类<!-- encoder is required --><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" ><customFields>{"appname":"${appName}"}</customFields> // 索引名</encoder> </appender>

logback.xml如下:

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true"><contextName>MovieBooking</contextName><timestamp key="TIMESTAMP" datePattern="yyyy-MM-dd" /><property name="LOGPATH" value="log" /><springProperty scope="context" name="appName" source="server.Name" defaultValue="localhost.log"/><!-- 输出到控制台 --><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern></layout></appender>
<!-- 输出到文件 --><appender name="fileLog"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOGPATH}${file.separator}${TIMESTAMP}.log</file><append>true</append><encoder><pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOGPATH}${file.separator}all${file.separator}%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><param name="Encoding" value="UTF-8"/><remoteHost>192.168.1.102</remoteHost><port>10514</port><!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类<!-- encoder is required --><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" ><customFields>{"appname":"${appName}"}</customFields></encoder></appender>

<root level="INFO"><appender-ref ref="fileLog" /><appender-ref ref="stdout" /><appender-ref ref="logstash" /></root></configuration>

3、测试

添加单元测试类:

package com.example.demo;
import com.example.service.StudentService;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringRunner.class)@SpringBootTest@Slf4j@WebAppConfigurationpublic class DemoApplicationTests { @Autowired private StudentService studentService;
@Test public void Test() {log.info("测试日志{}","台风山竹,威力很大!");log.info(studentService.findAllStudent().get(0).toString()); }}

4、验证








                                                        有收获的劳烦点个在看,然后帮转,感谢↓↓↓