java-ee - Java企业开发的日志究竟该怎么记?

 手机用户2602883245 发布于 2022-10-29 11:51

我有个疑惑,都说日志不该记录异常信息,诸如e.getMessage(),但这样的话,究竟怎么记这个日志才能在出现问题的时候一下能定位到问题出在哪里?因为生产环境和开发环境毕竟不一样,生产环境出错了,还得在开发环境检查bug,可能根本查不出来。

3 个回答
  • 如果是用log4j或者slf4j,在记录日志时的最末尾可以加上异常对象像这样:
    logger.error("异常信息:param={}",param,e);

    2022-10-30 17:30 回答
  • 我建议用log4j,灵活、强大
    log4j例子

    2022-10-30 17:33 回答
  • 说说我对日志的理解吧。
    在实际开发过程中日志对我们是一个非常重要的东西,如果在运行时出现问题(大多情况看上去都是偶然性的,但是实际是必然现象),这种问题如果没有记录日志,要重现场景就很困难,如果无法重现场景调试又没有日志那要解决这个问题就需要神助了。

    在每一个项目在不同的阶段对日志的处理也是不一样的,这取决于你项目的成熟度,如果你的项目足够成熟,功能已经足够完善并且也经过了考验那将日志级别适当放高甚至是关闭。

    如果你的项目处于快速开发迭代的过程将日志记录详细并将日志级别放低这是非常有必要的,而且肯定是要记录堆栈信息,将参数准确的记录,这都会帮助你快速分析定位问题。
    当然在程序运行时是有上下文的,在记录日志的时候尽量避免重复记录,因为重复的日志只会增加日志的文件大小,对于问题的定位并不会有太大的帮助

    日志到底还应该记录什么呢,这个得仁者见仁智者见智了,我就说说我平时的做法吧。
    比如我现在调用微信接口发送一个模板消息

    1. 在调用前记录完整的请求参数

    2. 调用完成后记录微信的返回结果

    3. 如果网络出现错误还需要将Exception记录下来

    LOG.info("发送模板消息 ==>> {}:{}", url, params);
    Response response = httpClient.newCall(request).execute();
    LOG.info("发送模板消息 <<== {}", response);
    
    byte[] b = response.body().bytes();
    try {
        Map<String, String> result = objectMapper.readValue(b, STR_OBJ_MAP);
        if ("0".equals(result.get("errcode"))) {
            return "SUCCESS";
        }
    
        LOG.error("发送模板消息失败 <<== {}", result);
        ...
    } catch (IOException e) {
        LOG.error("发送模板消息失败 <<== {}", new String(b, "UTF-8"), e);
        throw e;
    }

    PS:有的人可能认为日志记录太多会影响程序的性能,其实我觉得要根据实际情况而定,大多数我们都不会遇到这种情况,因为当项目足够稳定的时候日志完全可以将级别提高甚至是关闭,而且现在的技术log4j2logback处理速度已经非常快了在加上log4j2还支持异步日志处理。

    是保证业务功能更重要还是其它

    2022-10-30 17:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有