日志框架用的是log4j还是log4j2?日志应在哪些地方重点打印?

1 个回答

  • 石室大叔
    看透不说透,是规矩,也是格局。
    ### 一、Log4j vs Log4j2:建议用 Log4j2 #### 建议使用 `Log4j2` * `Log4j`(1.x)已停止维护,有已知安全漏洞(如 log4shell 漏洞); * `Log4j2` 是其后续版本,**性能更高**、**安全性更强**、**功能更丰富**; * 使用 `AsyncAppender` 或 `Disruptor` 模式时性能远超 `logback` 和 `log4j`。 #### 如果你还在用 Log4j 1.x,建议立即升级或迁移到: * `Log4j2` * 或 Spring 项目常用的 `Logback` ### 二、日志应在哪些地方重点打印? #### 1. **接口入口和出参** * 打印请求参数(如 IP、用户 ID、业务参数) * 打印接口出参或结果状态(成功/失败、耗时) ```java log.info("用户登录请求: userId={}, ip={}", userId, ip); ``` #### 2. **关键业务操作点** * 状态变更、订单支付、库存扣减、发货等行为 ```java log.info("订单创建成功,orderId={}", orderId); ``` #### 3. **异常捕获处(catch 块)** * 打印异常信息和堆栈,便于排查 ```java log.error("支付处理异常,orderId={}", orderId, e); ``` #### 4. **数据库、缓存等外部依赖失败** * 包括超时、连接异常、数据异常 ```java log.warn("Redis 缓存获取失败,key={}", key, e); ``` #### 5. **任务类(定时任务/批处理)** * 启动、结束、处理量、失败明细 ```java log.info("任务开始:同步订单数据"); log.info("任务结束:成功 {} 条,失败 {} 条", success, failed); ``` #### 6. **性能监控点(耗时统计)** * 记录慢接口、慢 SQL、关键流程耗时 ```java log.info("接口耗时:{}ms,url={}, userId={}", duration, requestUrl, userId); ``` ### 三、日志级别建议 | 日志级别 | 用途 | | ------- | ------------------- | | `DEBUG` | 调试细节,默认不输出到生产环境 | | `INFO` | 正常业务日志,流程行为、统计、重要状态 | | `WARN` | 非致命问题,如超时、异常重试、容错场景 | | `ERROR` | 异常、失败、程序出错等,需关注告警 | | `FATAL` | 致命错误,系统可能崩溃(很少用) | ### 四、其他建议 * 日志**不可打印敏感信息**(如密码、银行卡号); * 大字段(如商品详情、长 JSON)**避免打全量日志**,影响性能和可读性; * 日志加上 `traceId`、`userId`,方便链路追踪。
    编辑于 2025-07-26 10:54 •IP属地 北京
    举报
    评论
    收藏