2020-08-17 22:14:29 卢浮宫 版权声明:本文为站长原创文章,转载请写明出处
最近在对目前的项目做一个新的构建(单体架构转向微服务),那么随理成章的在日志方面我们会摒弃掉目前以DB记录操作日志的行为。
同样的,ELK作为一套完善的日志手机和展示的解决方案,我们没理由不选择它。于是,让我们开始吧...
2.1、ELK是elasticsearch + logstash + kibana的首字母缩写。是一套完善的日志收集和展示的解决方案
2.2、结构体系
2.2.1、Elasticsearch:实时的分布式搜索和分析引擎 。
2.2.2、Logstash是服务器端数据处理的管道,能同时从多个数据源进行数据采集和转换工作,最后发送到Elasticsearch中。
2.2.3、Kibana可以让用户在Elasticsearch中使用图形和图标对数据进行可视化分析。
PS: 附上官方网站 ELK官网
2.3、ELK主要用途:
2.3.1、问题排查:当线上有问题需要做问题排查时可以从海量日志分析工作中解脱出来。
2.3.2、监控预警:我现在每天第一件事就是查看服务器状态和问题日志掌握当前信息,查看日志有无异常信息把问题争取扼杀在摇篮里
使用ELK可以提升这部分的工作效率。
2.3.3、数据分析:后面我们可能要进行数据埋点,分析用户操作及行为。有设想使用这部分作为辅助。
3.1、Elasticsearch
3.1.1、安装并运行(依赖JDK环境、相关安装包为个人使用的网盘资源)
① 下载压缩包:https://pan.baidu.com/s/1YfplTSJqIEGa6WNSbYYRVw 提取码:9eny
② 切换到bin目录下,运行elasticsearch.bat批处理文件,结果如下:
③ 在浏览器中输入http://localhost:9200/进行验证
http.cors.enabled: true
http.cors.allow-origin: "*"
④ 编辑elasticsearch-head/Gruntfile.js
connect: {
server: {
options: {
hostname:'*',
port: 9100,
base: '.',
keepalive: true
}
}
}
⑤ 执行 npm run start 启动项目。并在 localhost:9100中进行界面确认
3.2、Logstash安装配置及运行
① 下载:链接:https://pan.baidu.com/s/15u0aLpQ9d_rjFZeZNsWPzQ 提取码:dz4b
② 在bin目录下创建 logstash.conf文件并进行一下配置
input {
# 这里是使用RabbitMQ + logBack 所以需要有MQ的相关配置
rabbitmq {
type =>"all"
durable => true
exchange => "rabbit.log"
exchange_type => "direct"
key => "info"
host => "127.0.0.1"
port => 5672
user => "xa"
password => "guangmuhua"
queue => "log_queue"
auto_delete => false
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "test-logstash-%{+YYYY-MM}"
}
}
③ 同样指向到bin目录下,运行logstash -f logstash.conf
④ 运行成功后可以通过浏览器输入localhost:9600看到以下信息
3.3、kibana
① 下载:链接:https://pan.baidu.com/s/1QmcoohLJnIm3e9zIXz6rSg 提取码:unu6
② 指向到bin目录文件下 运行kibana.bat处理文件
③ 成功后浏览器输入 localhost:5601界面如下
3.4、logBack及RabbitMQ配置
① logback-spring.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="d:/" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出,%d:日期;%thread:线程名;%-5level:级别,从左显示5个字符宽度;%msg:日志消息;%n:换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<appender name="RABBITMQ"
class="org.springframework.amqp.rabbit.logback.AmqpAppender">
<layout>
<pattern><![CDATA[ %d %p %t [%c] - <%m>%n ]]></pattern>
</layout>
<!--rabbitmq地址 -->
<addresses>127.0.0.1:5672</addresses>
<username>XXX</username>
<password>XXX</password>
<declareExchange>true</declareExchange>
<!-- 这里的配置很重要 -->
<exchangeType>direct</exchangeType>
<exchangeName>rabbit.log</exchangeName>
<routingKeyPattern>info</routingKeyPattern>
<generateId>true</generateId>
<charset>UTF-8</charset>
<durable>true</durable>
<deliveryMode>NON_PERSISTENT</deliveryMode>
<autoDelete>false</autoDelete>
<!-- 这里的配置很重要 -->
</appender>
<logger name="com.light.rabbitmq" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RABBITMQ"/>
</logger>
<!-- 日志输出级别,level 默认值 DEBUG,root 其实是 logger,它是 logger 的根 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="RABBITMQ" />
</root>
</configuration>
② RabbitMQ 相关配置
.创建一个名称为 log_queue 的队列
.创建一个名称为 rabbit.log 的交换器(类型为direct)
.将log_queue 队列绑定到rabbit.log上(toQueue为 log_queue, Routing Key 为info)
③ 写一个测试程序
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(LoggerApplication.class, args);
while (true){
System.out.println("每隔3秒写入一次日志。" + new Date().toString());
logger.info("log insert:" + new Date().toString());
Thread.sleep(3000);
}
}
④ 这个时候进入kibana就可以看到效果了,具体如下:
文章篇幅及笔者功力有限,可能有部分阶段描述的不太明确。建议如有相关点卡住,可以多看看官方文档和网上资料(不要用baidu,用bing和google)
如果有问题点确实或文章中不明确甚至是错误问题,可以与站长沟通。学无止境,希望我们能一起郊游、共同进步...