在项目中对日志进行收集是大部分系统都会做的,收集日志的好处:可以方便调式,快速验证、定位问题等,而收集日志的方式有多种,下面说说常见的几种方式的好坏。

  • 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中查询数据