Java开发手册之日志规约[通俗易懂]

Java开发手册之日志规约[通俗易懂]Java开发手册之日志规约

大家好,又见面了,我是你们的朋友全栈君。

  1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架
    SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory; 
 private static final Logger logger = LoggerFactory.getLogger(Abc.class);  
  1. 【强制】日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。
  2. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:
    appName_logType_logName.log。logType:日志类型,推荐分类有stats/desc/monitor/visit等;
    logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
    正例:mppserver应用中单独监控时区转换异常,如:
    mppserver_monitor_timeZoneConvert.log 

说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。

  1. 【强制】对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);  
  1. 【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。
    正例:
  2. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
    正例logger.error(各类参数或者对象toString + "_" + e.getMessage(), e);
  3. 【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
    说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
  4. 【参考】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error级别只记录系统逻辑出错、异常等重要的错误信息。
    如非必要,请不要在此场景打出error级别。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106525.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 淘宝准点秒杀脚本

    淘宝准点秒杀脚本腾讯云服务器优惠购买链接:1核2G云服务器首年88元:http://url.cn/5Z0ZWGI准备软件下载地址:https://download.csdn.net/download/tangcv/11968538pycharm文件太大,不好上传,直接去官网下载:https://www.jetbrains.com/pycharm/download/#section=windo…

    2022年6月14日
    34
  • STM32F103驱动GT911

    STM32F103驱动GT9110x00引脚连接://SCL——-PB10//SDA——-PB11//INT——–PB1//RST——–PB2IIC的SCL与SDA需要接上拉电阻!0x01模拟IIC:在模拟IIC的头文件中:定义所需的IO操作宏://IO操作函数#defineIIC_SCLPBout(10)//…

    2022年6月30日
    32
  • Python如何生成exe文件?用Pycharm一步一步带着你学(超详细、超贴心)

    Python如何生成exe文件?用Pycharm一步一步带着你学(超详细、超贴心)目的描述:为了让没有安装Python的人也能使用我们编写的.py文件,我们需要将编写好的Python程序生成.exe文件。第一步下载pyinstallerpyinstaller插件是Python自带的插件,用于为我们写好的代码进行打包,最终自动合成.exe文件。在Pycharm界面的最下面,你可以看到Terminal,选择这个选项,这就是一个终端界面。在此界面写输入指令:pipin…

    2022年6月11日
    26
  • php小程序开发完整教程_苹果X怎么下载微信分身

    php小程序开发完整教程_苹果X怎么下载微信分身使用HBuilderX与微信开发者工具实现授权登陆功能,测试号申请

    2025年8月5日
    3
  • 驼峰命名转换_大驼峰命名法

    驼峰命名转换_大驼峰命名法以前没有写过项目时为了防止出错,数据库和实体类里的变量都统一设置一模一样后来才知道规范的都是使用驼峰命名转换统一设置例如:在xml里配置全局属性<configuration><!–配置全局属性–><settings><!–使用jdbc的getGeneratedKeys获取数据库自增主键值–>…

    2025年7月21日
    2
  • Python进阶(九)Python陷阱:Nonetype「建议收藏」

    Python进阶(九)Python陷阱:Nonetype「建议收藏」而在上面的程序中,虽然高阶函数calc_prod()有返回值ff,但是ff()却没有返回值,则传递到外层函数calc_prod()同样没有返回值,故输出了。针对这一问题,自己在IDEA中进行了调试,发现果然多输出了一行None。只有值可以改变,其他只读。之所以出现是因为定义了一个变量或函数,却没有值或者返回值,因此会默认值为。发现b的值确实为None,且其类型为NoneType。若代码改为如下所示,则可以完美实现列表的输出。它不支持任何运算也没有任何内建方法。对象具有三个特性:身份、类型、值。

    2025年8月24日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号