-
日志信息的组成:
- 时间
- 日志级别
- 调用链标识(可选,分布式应用中traceId+spanId)
- 线程名称
- 日志记录器名称
- 日志内容
- 异常堆栈
-
日志级别
日志级别主要有Debug、Info、Warn、Error。
(1)DEBUG:主要输出调试性质的内容,用于开发、测试阶段,给出详细的提示信息;
(2)INFO:提示性信息,用于生产环境,常见的有:- 启动信息,主要是一些重要的配置参数
- 一些重要的依赖注入的类名
- 方法中重要的部分,如SQL、以及一些重要的入参等等
(3)WARN:警告性质的信息。
(4)ERROR :错误、异常,对程序影响不大的用WARN,影响大的用ERROR。 -
日志文件命名
日志文件放置于固定的目录中,按照一定的模板进行命名,推荐的日志文件名称:- 当前正在写入的日志文件名:<应用名>[-<功能名>].log
- 已经滚入历史的日志文件名:<应用名>[-<功能名>].log.<yyyy-MM-dd>
-
信息安全
在打印日志的时候,要避免敏感信息的泄漏,如:姓名、密码、身份证、电话、秘钥、邮箱、地址、银行卡等;可以采用“***”对部分信息进行遮盖。 -
日志配置
Logger框架的三大部分:Logger用于收集日志,Layout用于格式化日志,Appender用于控制日志的输出。其中Appender是我们经常要使用的部分:- 本地调试可以将日志输出到控制台上
- 测试环境或者生产环境输出到文件中,每天产生一个文件,如果日志量庞大可以每个小时产生一个日志文件
- 生产环境中的文件输出,可以考虑使用异步文件输出,该种方式日志并不会马上刷新到文件中去,会产生日志延时,在停止应用时可能会导致一些还在内存中的日志未能及时刷新到文件中去而产生丢失,如果对于应用的要求并不是非常高的话,可暂不考虑异步日志
logback 日志工具可以在日志文件滚动后将前一文件进行压缩,以减少磁盘空间占用,若使用 logback 对于日志量庞大的应用建议开启该功能。
-
注意事项
- 禁用 System.out.println
- 预防空指针(不要因为日志问题,造成接口不可用😂)
- 不要在日志中进行“字符串拼接”,采用日志提供的格式化,可以避免隔离级别改变时产生的不必要的性能损耗。
- 需要输出日志的对象,请实现toString方法
- 不要吞掉异常堆栈,这样会导致出现问题时,无法排错
logger.error("System error {}", "无此用户", e);
参考文献
https://mp.weixin.qq.com/s/d-lH-lPkEWNRKIoXwSBwhQ(Java应用中的日志)
网友评论