美文网首页java
后端打日志经验

后端打日志经验

作者: 修行者12138 | 来源:发表于2020-08-27 14:56 被阅读0次
日志要做到便于检索,不要打印不体现具体业务的日志
// 反例
logger.info("定时任务开始执行");
// 正例
logger.info("批量转换制度文件定时任务开始执行");
划重点:便于检索是打印日志的重中之重!!!便于检索,才容易定位问题。
打印了足够多的日志,但是难以检索,定位问题依然很难。
对于逻辑较复杂的方法,每实现一个小功能,就打日志说明
// 反例
public void method() {
    // function1...
    ...
    logger.info("调用API成功");

    // function2...
    ...
    logger.info("文件转换成功");
}
// 正例
public void method() {
    // function1...
    ...
    logger.info("调用查询舆情API成功");

    // function2...
    ...
    logger.info("制度文件转换成功");
}
对于有多个退出条件的方法,每一个退出条件都打日志说明
// 反例
public void method() {
    if (condition1) {
        logger.info("没有需要转换的文件");
        return ;
    }

    ...

    if (condition2) {
        logger.info("没有需要更新的数据");
        return ;
    }
}
// 正例
public void method() {
    if (condition1) {
        logger.info("没有需要转换的制度文件");
        return ;
    }

    ...

    if (condition2) {
        logger.info("没有需要更新的舆情数据");
        return ;
    }
}
打印异常堆栈信息时,附加信息不能为空,否则很难检索
// 反例
logger.error("", e);
logger.error("数据入库异常", e);
// 正例
logger.error("舆情数据入库异常", e);
不要因为toString方法导致日志遗漏关键信息

如果没有重写toString方法,会继承父类的toString方法,不会打印子类的属性,需要重写toString()方法;
如果使用lombok生成的toString方法,只打印子类属性,不会打印父类属性,解决办法是使用@ToString(callSuper = true)

对于关键方法,一定要有开始和结束方法的日志,否则难以判断该方法是否正常开始和结束
如有需要,for循环中每一次循环结束后打印日志,否则无法定位某一次循环是否执行成功,打印的日志需要有标识信息,以便定位到具体是哪一次循环出了问题
// 反例
for (...) {
    try {
        ...
    } catch (Exception e) {
        LOG.info("message commit offset fail ", e);
    }
}
// 正例
for (...) {
    try {
        ...
    } catch (Exception e) {
        LOG.info("message commit offset fail, partition: {}, offset: {}", record.partition(), record.offset(), e);
    }
}

相关文章

网友评论

    本文标题:后端打日志经验

    本文链接:https://www.haomeiwen.com/subject/pqelsktx.html