Logger 能记录什么
Logger(日志记录器)是软件开发中用于记录程序运行状态、事件、错误信息的核心工具,其记录的内容取决于配置、业务需求和场景。下面是 Logger 通常能记录的内容分类及说明:
一、基础信息类
这类信息用于描述日志的“元数据”,几乎所有 Logger 都会包含:
- 时间戳(Timestamp):日志产生的时间(如
2024-05-20 14:30:00.123),用于定位事件发生的时间点。 - 日志级别(Level):标识日志的重要程度,常见级别(从低到高):
DEBUG:调试细节(如变量值、方法参数),仅开发/测试环境启用。INFO:常规运行信息(如服务启动、任务完成)。WARN:潜在问题(如配置缺失、性能瓶颈预警),不影响核心功能。ERROR:错误事件(如接口调用失败、数据校验不通过),可能导致功能异常。FATAL/CRITICAL:致命错误(如服务崩溃、数据库无法连接),程序可能终止。
- 日志来源(Source):产生日志的类、方法、文件或模块(如
com.example.UserService、OrderController.java:45)。 - 线程/进程信息:如果是多线程/多进程程序,会记录线程 ID(TID)或进程 ID(PID),便于排查并发问题。
二、事件与业务类
记录程序运行中的具体事件或业务逻辑:
- 用户操作:如“用户 ID=123 登录成功”“用户修改了订单状态为‘已支付’”。
- 业务流程节点:如“订单创建开始”“支付回调处理完成”“数据同步任务启动/结束”。
- 外部交互:调用第三方接口的请求(如 API 路径、参数)和响应(如状态码、返回数据);数据库查询的 SQL 语句、执行时间、影响行数。
- 配置加载:如“加载配置文件
app.yml成功”“使用默认配置:超时时间=30s”。
三、错误与异常类
用于问题排查,是 Logger 最重要的用途之一:
- 异常堆栈(Stack Trace):捕获到的异常(如
NullPointerException、IOException)的完整堆栈信息,包括异常类型、错误消息、触发方法/行号。 - 错误上下文:异常发生时的关键变量值(如“用户 ID=456 时,订单金额为 null”)、输入参数(如“请求参数:{id: 789, type: ‘vip’ 不存在}”)。
- 系统错误:如“磁盘空间不足”“内存溢出(OOM)”“线程池满”“连接池耗尽”。
四、性能与监控类
用于系统优化和监控:
- 执行时间:方法/接口的耗时(如“查询用户列表耗时 120ms”“数据库查询耗时 50ms”)。
- 资源使用:内存占用、CPU 使用率、线程数、连接数(部分 Logger 结合监控工具记录)。
- 流量统计:如“1分钟内接口
getUserInfo调用 100 次”“缓存命中率 85%”。
五、调试与诊断类
开发/测试阶段用于定位问题:
- 变量值:关键变量的实时取值(如“当前用户列表大小=5”“缓存 key=order_123 的值为 {…}”)。
- 分支判断:条件分支的执行情况(如“进入 if (user != null) 分支”“循环执行第 3 次”)。
- 临时日志:开发时临时添加的调试信息(如“此处 user 对象为:{…}”),发布前通常会移除或降级为
DEBUG。
六、安全与审计类
涉及安全合规和审计需求:
- 敏感操作审计:如“管理员删除了角色 ID=5”“修改了用户权限”。
- 安全事件:如“登录失败次数过多(IP=192.168.1.1)”“检测到 SQL 注入尝试”“文件访问越权”。
- 认证/授权:如“用户 Token 过期”“权限校验失败:用户无访问接口
/admin的权限”。
七、自定义扩展类
根据业务需求自定义记录内容:
- 业务标识:如“订单 ID=1001”“事务 ID=tx_abc123”(用于关联同一流程的所有日志)。
- 环境信息:如“环境=生产”“Region=华东”“版本号=v2.1.0”。
- 自定义标签:如“module=payment”“tag=discount”(便于日志筛选和聚合)。
示例:一条完整的日志可能长这样
2024-05-20 14:30:00.123 [INFO] [thread-1] [com.example.OrderService] - 订单创建成功,订单ID=1001,用户ID=123,金额=299.99,耗时=45ms
2024-05-20 14:30:05.456 [ERROR] [thread-3] [com.example.PaymentClient] - 支付接口调用失败,订单ID=1001,错误信息:连接超时,堆栈:java.net.SocketTimeoutException: Read timed out at ...
注意事项
- 避免记录敏感信息:如密码、身份证号、银行卡号等(需脱敏,如
身份证号:110***********1234)。 - 日志级别合理控制:生产环境通常关闭
DEBUG,只保留INFO及以上级别,避免日志量过大。 - 结构化日志:尽量使用 JSON 等结构化格式(如
{"time":"2024-05-20 14:30:00","level":"INFO","orderId":"1001"}),便于日志分析工具(如 ELK、Splunk)解析。
总之,Logger 的记录内容围绕“程序发生了什么、为什么发生、产生了什么影响”展开,帮助开发者监控程序、排查问题、优化性能。