JAVA项目日志管理(包含各种类型日志解决方案,超详细)

3,472 阅读4分钟
  • 概述:

    1、作用:记录行为信息,记录错误过程,方便查找历史记录,线上问题排查。

    2、核心问题:记录信息过多会导致文件存储过大,打印过程消耗性能,查找问题难以快速定位;记录信息过少则在需要时无法找到问题根源,无法追踪问题。

    3、需根据需求在性能,存储,信息量,查询定位做出权衡。

  • 输出方式:

    1、输出控制台打印,如log.info(),System.out.println();一般在开发环境使用。线上环境需关闭控制台打印日志。

    2、输出至文件存储,如使用log4j,logback输出至文件,JVM启动参数中配置打印GC日志。

    3、存储数据库表中,一般为项目定制日志,如数据新增,更新日志。

    4、输出志中间件中,如使用ELK存储在Elasticsearch中。

  • 各日志类型解决方案:

    1、常规堆栈日志:如项目启动过程打印的各种初始化实例,建立连接日志。一般使用Logback,log4j2实现,log4j性能较差,一般不推荐,而门面通常使用Slf4j显示输出日志,这里贴上,(slf4j log4j logback的关系)链接,具体可以自己查看。一般常规项目使用Slf4j结合Logback实现,SpringBoot项目可以结合 Spring Boot Actuator实现日志打印及动态修改日志

    2、存储至数据库日志:最简单的实现就是接口内部直接往数据库中插入一条日志数据,这里贴一个常规建表sql语句。

    CREATE TABLE `system_log` (
      `id` varchar(32) NOT NULL DEFAULT '' COMMENT 'id',
      `module` varchar(255) DEFAULT NULL COMMENT '模块',
      `user_name` varchar(32) DEFAULT NULL COMMENT '操作人昵称',
      `user_id` varchar(32) DEFAULT NULL COMMENT '操作人ID',
      `method` varchar(255) DEFAULT NULL COMMENT '方法',
      `operation` varchar(255) DEFAULT NULL COMMENT '操作',
      `args` varchar(5000) DEFAULT NULL COMMENT '参数',
      `time` int(11) unsigned DEFAULT '0' COMMENT '执行时长(毫秒)',
      `ip` varchar(32) DEFAULT NULL COMMENT 'IP',
      `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作日志表';
    

    但是一般我们为了解耦,降低对代码的侵入,并且减少打印日志对用户请求时间的性能影响,可以使用Spring AOP自定义注解做日志打印,对Spring AOP不了解的可以看这篇文章:Spring AOP - 注解方式使用介绍(长文详解)

    除此之外也可以使用线程池做异步打印,只需在日志打印的方法上加上@Async注解即可实现异步打印。详情可见:SpringBoot:详解@EnableAsync + @Async,也可以使用消息队列进行异步打印,不过需项目接入消息队列中间件,如果项目已经接入的可以使用。

    3、分布式大批量日志解决方案ELK(推荐),即Logstash采集、过滤、输出日志,Elasticsearch存储日志,Kibana查询日志,以实现分布式服务大规模批量日志的统一管理。

    ELK简介:

    ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

    Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

    Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

    这里只简要介绍一下ELK的基本概念和作用,贴上自己收藏的几个学习链接可自行查看,ELK官方文档(英文好的可以看这个),具体的实现教程 SpringBoot整合ELK教程,想要了解具体实现原理的可以看每个软件的单独教程:Elasticsearch详细教程Logstash教程Kibana教程

    这里贴一下我个人的github项目网址,Springboot-dubbo-zookeeper,里面有常规的logback日志打印配置文件,也有线程池打印日志使用,也有RabbitMq的实现,可以支持一下点个Star。

    总结:本文主要分析了各种类型的项目日志的解决方案,贴上了一些我个人学习过程中遇到的比较好的文章,主要做学习分享用,若违规可联系作者删除。