日志可以协助我们的调试和开发。在开发中尽量使用日志的方式来调试,是我们推荐的做法。尽量避免使用System.out.println. 因为很多时候我们调试完毕都要进行删除调试代码。留下会给程序增加运行时间。而日志可以很方便的控制级别就可以控制是否输入,而支持存储的形态很多。比如数据库,文件等。所以日志是我们开发中必不可少的一环。

trace < debug < info < warn < error
如果级别是:debug ,debug和 info以及error都会输出
如果级别是:info ,那么只会打印初:info和error
如果级别是error,只会打印:error
开发中我们使用最多的是info 和 error, info用于一些重要方法中各个环节的打印,如 入参、完成订单创建、完成支付时等等,而error主要是出现了错误时,比如报异常的时候,比如某个参数检查不合要求的时候

分布式日志方案

ELKElasticsearchLogstashKibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack

Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。

Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。

Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。

通过上面对ELK简单的介绍,我们知道了ELK字面意义包含的每个开源框架的功能。市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。

在这里插入图片描述

Logstash的使用

安装配置

下载 https://www.elastic.co/cn/downloads/logstash
解压

tar -xzf logstash-6.8.10.tar.gz

进入到logstash目录

执行下面的命令

bin/logstash -e 'input { stdin { } } output { stdout {} }'

这里是从控制台输入,然后输出到控制台,启动成功后输入字符,可以看到输出

在这里插入图片描述

插件

案例:当向某个文件输入内容是,触发logstash。将新增的内容,传递到es中
logstash 支持多种输入及多种输出,可以从官网查看

输入插件:https://www.elastic.co/guide/en/logstash/current/input-plugins.html

输出插件:https://www.elastic.co/guide/en/logstash/current/output-plugins.html

典型的应用场景,从各个应用的日志中收集数据,发送到ElasticSearch,那么可以使用File input pluginElasticsearch output plugin

输入插件

先来配置File input plugin

在服务器上新建一个日志目录 /opt/app/logs

mkdir -p /opt/app/logs
# 进入日志目录
cd /opt/app/logs
# 新建一个日志文件
touch 1.log

接下来配置Elasticsearch output plugin

修改上面的配置文件

input {
  file {
    # 插件编号,如果不指定,会自动生成一个,主要用于监控时区分
    id => "my_file_plugin_1"
    # 监控的文件路径,这里监控目录下的所有文件
    path => "/opt/app/logs/*"
  }
}
output{
    elasticsearch{
        # elasticsearch集群地址,多个地址以逗号分隔
        hosts=>["192.168.136.150:9200"]
        # 创建索引
        index=>"app-1-logs"
    }
}

//启动logstash
bin/logstash -f config/file.conf
//跳转log目录
cd /opt/app/logs
echo "hello world" >> 1.log

同样往1.log中发送日志,可以在ElasticSearch中查看

打开head插件

在这里插入图片描述
这里需要注意,如果出现下面的错误
在这里插入图片描述
一般是因为ES的存储空间不足,当磁盘的使用率超过95%时,Elasticsearch为了防止节点耗尽磁盘空间,自动将索引设置为只读模式。

更改elasticsearch.yml配置文件,在config/elasticsearch.yml中增加下面配置

# 禁用磁盘分配决策程序
cluster.routing.allocation.disk.threshold_enabled: false

重新启动ES即可,在生产环境一定要关注ES的磁盘使用率.

ELK演示案例

启动ELK

下载整合了ES Kibana LogStatsh的镜像

docker pull sebp/elk:771 

创建容器并启动

docker run -d --name elk -p 5601:5601 -p 9200:9200 -p 5044:5044  sebp/elk:771

端口说明

5601 - Kibana web 接口
9200 - Elasticsearch JSON 接口
5044 - Logstash 日志接收接口

查看启动日志

docker logs -f elk

可能出现的错误

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf 

添加下面配置:
vm.max_map_count=655360

并执行命令:
sysctl -p

然后,重新启动elk,即可启动成功。
docker start elk

输入: http://192.168.12.133:9200 查看下面画面代表es启动成功
在这里插入图片描述
输入:http://192.168.12.133:5601查看下面画面代表kibana启动成功

在这里插入图片描述

2 配置LogStatsh

启动成功后 我们需要做下简单的配置,首先是LogStatsh的配置.

进入到容器中

docker exec -it -u root elk bash

编辑logStatsh的配置

vim /etc/logstash/conf.d/02-beats-input.conf

覆盖配置

input为输入的配置,output为输出的配置

input {
    tcp {
        port => 5044
        mode => "server"
        type => json
    }
} 
output{
    elasticsearch {
        hosts => ["localhost:9200"]
        action => "index"
        codec => rubydebug
        index => "log4j2-%{+YYYY.MM.dd}"
    }
}


修改完毕后exit退出,然后重启容器

docker restart elk

配置项目

添加依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.2</version>
</dependency>

添加日志配置文件logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF" monitorInterval="60">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <Socket name="Socket" host="192.168.136.160" port="5044" protocol="TCP">
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %M() @%L - %msg%n" />
        </Socket>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="Socket"/>
        </root>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.mybatis" level="INFO"/>
    </loggers>
</configuration>

kibana查看日志

点击Management
创建索引匹配格式: 2填写即可
在这里插入图片描述
设置匹配格式log

在这里插入图片描述
1下拉框选择@timestamp 以时间戳排序
在这里插入图片描述
创建后 在发现中心查看日志
在这里插入图片描述
在这里插入图片描述

1. 是需要显示的字段
2. 是可选过滤字段
3. 日志的显示区域

在启动另一个微服务 查看日志情况吧

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐