探究java日志规范和日志框架选型

内容简介

寻求一个日志使用的规范,搜集网上各路分享所得汇总.最终选型log4j2+slf4j.

阿里日志规约

  1. 【强制】应用中不可直接使用日志系统(Log4j、 Logback) 中的 API,而应依赖使用日志框架
    SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    private static final Logger logger = LoggerFactory.getLogger(Abc.class);
  2. 【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。
  3. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等) 命名方式:
    appName_logType_logName.log。 logType:日志类型,推荐分类有
    stats/desc/monitor/visit 等; logName:日志描述。这种命名的好处:通过文件名就可知
    道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
    正例: mppserver 应用中单独监控时区转换异常,如:
    mppserver_monitor_timeZoneConvert.log
    说明: 推荐对日志进行分类, 如将错误日志和业务日志分开存放,便于开发人员查看,也便于
    通过日志对系统进行及时监控。
  4. 【强制】对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方
    式。
    说明: logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
    如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,
    会执行 toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
    正例: (条件)
    if (logger.isDebugEnabled()) {
    logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
    }
    正例: (占位符)
    logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
  5. 【强制】避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false。
    正例:
  6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过
    关键字 throws 往上抛出。
    正例: logger.error(各类参数或者对象 toString + “_” + e.getMessage(), e);
  7. 【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志; 有选择地输出 info 日志; 如果使
    用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘
    撑爆,并记得及时删除这些观察日志。
    说明: 大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。 记录日志时请
    思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
  8. 【参考】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适
    从。注意日志输出的级别, error 级别只记录系统逻辑出错、异常等重要的错误信息。如非必
    要,请不要在此场景打出 error 级别

转自:程序员的修养 – 如何写日志(logging)

(https://www.cnblogs.com/sentakee/p/5630466.html)

  • 日志的可读性

我常常见到很多同事在日志中打印特殊的标识符号,例如 “+++++++++++”,“--------------”和“==============”,这些符号往往让人眼花缭乱。他们的本意也仅仅是在自己调试的时候能一眼就发现这是自己的日志。既然如此,把自己名字,功能步骤点写入日志中岂不是更明确?
(以上内容仅是开发DEBUG常见,一般不属于我们日志收集信息的场景)

  • 日志的性能

尽量避免在在大的循环中打印意义不大的日志内容。
输出日志使用slf4j参数锚点/占位符方式.降低不必要的性能损耗.

  • 占用的磁盘空间

通常,我们都是把日志写入磁盘上的日志文件中。适当的使用滚动日志并且定时清除旧文件是有好处的。(日志的运维角度)

  • 日志的时效性

有的时候我们并不能及时的发现问题。需要追溯之前的日志。所以我们是需要保留一段时间以内的日志便于追溯。

  • 日志的级别

通常我们在产品环境中日志的级别都在INFO以上,所以我们必须保证在这样的情况下程序仍然能够输出足够我们作出判断的信息。

  • 日志的内容

我们在写日志的时候,需要注意输出适当的内容。
首先,尽量使用业务相关的描述。我们的程序是实现某种业务的,那么就最好能描述清楚这个时候走到了业务过程的哪一步。
其次,避免在日志中输出一些敏感信息,例如用户名和密码。
以及,要保持编码的一致。如果不能保证就尽量使用英文而不是中文。这样当我们拿到日志之后就不会因为看到一堆乱码而不知所云了。

转自: 基本的Logger编码规范

(http://www.cnblogs.com/kofxxf/p/3713472.html)
1.在一个对象中通常只使用一个Logger对象,Logger应该是static final的,只有在少数需要在构造函数中传递logger的情况下才使用private final。
在这里插入图片描述

2.输出Exceptions的全部Throwable信息,因为logger.error(msg)和logger.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的StackTrace信息。
在这里插入图片描述
3.不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志。
在这里插入图片描述
4.不允许出现System print(包括System.out.println和System.error.println)语句。
在这里插入图片描述
5.不允许出现printStackTrace。
在这里插入图片描述
6.日志性能的考虑,如果代码为核心代码,执行频率非常高,则输出日志建议增加判断,尤其是低级别的输出<debug、info、warn>。
debug日志太多后可能会影响性能,有一种改进方法是:
在这里插入图片描述
但更好的方法是Slf4j提供的最佳实践:
在这里插入图片描述
一方面可以减少参数构造的开销,另一方面也不用多写两行代码。
7.有意义的日志
通常情况下在程序日志里记录一些比较有意义的状态数据:程序启动,退出的时间点;程序运行消耗时间;耗时程序的执行进度;重要变量的状态变化。
初次之外,在公共的日志里规避打印程序的调试或者提示信息。

总结

日志框架:使用Slf4j+log4j2
日志开发者使用规范:使用参数锚点/占位符方式输出日志;正确输出Exception的格式;根据需求规划日志的级别和输出内容;不适用printStackTrace;善用切面技术,简化部分日志的代码量.
日志分文件:拆分命名参考阿里规范;单个日志文件大小设置阈值;
日志输出格式配置:根据需求调整.
日志配置:配置log4j2异步模式或者异步混合模式;

参考资料

为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API
https://mp.weixin.qq.com/s/vCixKVXys5nTTcQQnzrs3w
Slf4j与log4j及log4j2的关系及使用方法
https://blog.csdn.net/Andrew_Yuan/article/details/83010938
Log4j2的性能为什么这么好?
https://blog.csdn.net/u013970991/article/details/81705758
Log4j 2的特性和改进(翻译来源英文官网)
https://blog.csdn.net/yangcheng33/article/details/52725882
Log4j2简介和异步日志梳理
https://www.jianshu.com/p/9f0c67facbe2
log4j2异步注意事项
https://www.jianshu.com/p/82469047acbf
Log4j2官网配置文件(英文)
https://logging.apache.org/log4j/2.x/manual/configuration.html
Log4j2一些示例Demo配置文件写法(英文)
https://howtodoinjava.com/log4j2/log4j2-properties-example/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值