在项目中对日志进行收集是大部分系统都会做的,收集日志的好处:可以方便调式,快速验证、定位问题等,而收集日志的方式有多种,下面说说常见的几种方式的好坏。
- 1.日志写入本地目录,以日志等级和日期为格式生成 txt 文件,会占用本地服务器IO,如果系统的某个接口有大量访问,也是IO操作的,那程序的处理性能可想而知,如果系统是分布式部署的,想查看日志都不知道在那台服务器上
- 2.日志写入数据库,会占用数据库连接,有大量日志写入数据库,时间一长数据库会很大,影响性能,备份还原真的很麻烦
- 3.日志输出到专业存储分析工具 ELK 中,会占用网络带宽资源,但内网的带宽是很大的,对比前1-2两种方式已经很好了,也是现在业界比较主流的收集方式
下面说说ELK日志收集
1.ELK是有Elastic(https://www.elastic.co/cn/)公司的三个组件配合进行日志收集,分别是:
- ElasticSearch:用于存储日志信息。
- Logstash:用于收集、处理和转发日志信息。
- Kibana:提供可搜索的Web可视化界面。
上面3个组件的关系,项目日志通过 Logstash 收集,存储到 ElasticSearch 中,然后 Kibana 绑定 ElasticSearch 的数据进行展示
(Beats轻量型数据采集器:https://www.elastic.co/cn/products/beats)
2.三大组件安装
有关ELK在Linux环境下的安装,如下:
3.SpringBoot项目日志输出到Logstash
- 1.先新建SpringBoot项目,把日志输出到Logstash上
- 2.引用依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.1</version>
</dependency>
- 3.在项目 resources 目录下创建 logback-spring.xml文件,配置logback日志信息,注意这里配置的destination属性,输出的要和logstash配置的对应上,不然收集不上,在Logstash的安装中,添加了一个springboot.conf,暴露4560端口并启动,在项目的logstash配置中连接次端口即可,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.68.149:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
- 4.修改启动类,加入一个方法,用于输出日志,如下所示:
@RestController
@SpringBootApplication
public class LogcollectApplication {
Logger logger = LoggerFactory.getLogger(LogcollectApplication.class);
@GetMapping("log")
public void test(){
logger.debug("message debug");
logger.info("message info");
logger.warn("message warn");
logger.error("message error");
logger.info("测试初始一些日志吧!");
}
public static void main(String[] args) {
SpringApplication.run(LogcollectApplication.class, args);
}
}
- 5.打开kibana管理页面,添加 logstash中创建的索引(在logstash的config目录下的 springboot.conf中的 index 键值就是索引 ),根据下图红色圈部分进行操作,最后在文本框中输入 springboot-logstash 会自动过滤出索引,然后点击 Next step,我已经安装了索引无法点击
然后点击 Discover,左上角下拉菜单中选中刚刚添加的 springboot-logstash-2019.09.17 索引
启动SpringBoot项目,访问日志接口,查看Kibana页面,会看到日志,可以添加过滤器对日志进行过滤,查看感兴趣的日志
添加过滤,可以根据界面提供的下拉框进行操作,下拉框满足不了需求时,可以自己调整过滤器的脚本,过滤器就是查询脚本,向 elasticsearch中查询数据
代码已传到码云上,地址:https://gitee.com/zhuyu1991/spring-cloud/tree/master/logcollect