正确的去使用日志
前言(分类)
日志一般我们记录两种,一种是系统日志,一种是操作日志。一般来说操作日志我们会记录到数据库,比如说用户xxx做了xxx操作,系统日志是由config配置框架来记录到日志文件里头。下面我重点讲解系统日志怎么写
1.日志输出的时机
对重要业务功能要多打日志。在方法入口记录参数,在关键步骤记录执行状态,在方法出口记录返回值,在异常处理时记录错误详情。
利用AOP切面编程自动给每个业务方法的执行前后添加日志,不错过任何调用信息。
不要在日志中记录密码等敏感信息,否则日志泄露就等于用户数据泄露。
2.控制日志的输出量
日志太多会导致刷屏,影响性能也难以查看。
通过添加条件来控制,比如批量处理时每100条才记录一次进度
在循环中用StringBuilder拼接字符串,循环结束后统一输出一行日志。
3.合理选择日志级别
日志分为TRACE、DEBUG、INFO、WARN、ERROR等级别,根据重要程度选择合适级别
在生产环境将级别设为INFO或WARN,这样DEBUG日志就不会输出,避免重要信息被大量调试日志淹没,让你在出问题时能快速找到错误。
4.统一日志格式
因为业务是交替请求执行的,所以日志会很乱,可能我一个请求的日志分别在第一行和第一百行,遇到排查单个问题的时候日志太散乱了,这时候需要统一日志格式来追踪定位
在日志配置文件中定义统一的格式,包含时间戳、线程名称、日志级别、类名和具体内容等关键信息。
通过MDC给日志添加请求ID和用户ID等上下文信息。这样即使多个请求的日志混在一起,也能通过requestld追踪某个请求的完整调用链路,通过userld查看某个用户的所有操作。
5.使用异步日志
大量的日志输出就要考虑性能问题,正常情况下日志是同步写入文件的,但是这样会阻塞主线程,异步单独线程去写日志能一定程度提高性能。但是这样做也有缺点,那就是如果系统突然崩了,一些日志在队列没来得及往文件写就会丢失
如果项目注重日志完整性就使用同步日志,如果注重性能就使用异步日志
6.日志文件的管理
由于日志不断的增长,会不断占用服务器存储内存。而且单一的日志文件也不利于我们去定位追踪问题,这时候就需要管理日志文件,去分片、定期清理没用的日志
通过配置滚动策略,按日期每天创建一个新文件,按大小超过10MB就切分文件,只保留最近30天的日志自动删除旧文件。
开启日志压缩功能,在文件名后缀加上.gz就能自动压缩。
7.集成日志收集系统(很重,小公司慎用)
对于分布式系统,我要去找日志定位问题会很麻烦,我需要挨个去登录各个服务器,例如我一个订单出问题,我需要去订单服务的服务器看日志,还要去购物车服务器看日志,去用户服务所在服务器看日志。操作很繁琐,这时候可以引入专业的日志管理系统来统一看日志
用专业的日志管理系统例如ELK(Elastic公司下面Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称)
Elasticsearch负责存储、搜索和分析操作,Logstash是一个数据收集引擎,负责清洗收集日志,Kibana是一个数据分析和可视化平台,通常与Elasticsearch配合使用,用于对其中的数据进行搜索、分析,并且以统计图标的形式展示。