关于常见日志的几种级别和格式
一、Log4j 日志级别(Log Levels)
日志级别从高到低(优先级递减)如下:
级别 | 描述 | 典型使用场景 |
---|---|---|
OFF | 最高级别,关闭所有日志输出。 | 生产环境紧急禁用日志 |
FATAL | 严重错误,导致应用程序崩溃(Log4j 2中已移除,用ERROR 替代)。 | 不可恢复的系统故障(如数据库连接彻底丢失) |
ERROR | 错误事件,但应用仍能运行。 | 异常捕获、业务逻辑失败 |
WARN | 潜在问题,不影响当前操作,但可能需要关注。 | 非预期参数、性能警告 |
INFO | 重要的运行时信息(默认级别)。 | 启动配置、关键业务流程日志 |
DEBUG | 调试信息,用于开发阶段。 | 变量值、方法调用跟踪 |
TRACE | 最详细的日志,记录程序执行的每一步。 | 复杂问题排查(如循环内部状态) |
ALL | 最低级别,输出所有日志。 | 极少使用 |
配置示例(log4j2.xml)
<Root level="INFO"><AppenderRef ref="Console"/> </Root> <Logger name="com.example" level="DEBUG"/> <!-- 特定包使用DEBUG级别 -->
二、Log4j 日志格式(Layouts)
日志格式决定了每条日志的输出样式,常见的Layout类型如下:
1. PatternLayout(最常用)
通过模式字符串自定义日志格式,支持占位符(Conversion Patterns)。
示例配置:
<Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console>
常用占位符:
占位符 | 含义 | 示例输出 |
---|---|---|
%d | 日期时间 | 2023-10-01 14:30:22 |
%t | 线程名 | main |
%-5level | 日志级别(左对齐,固定5字符) | INFO , ERROR |
%logger{36} | 类名(缩写,最长36字符) | com.example.MyClass |
%msg | 日志消息内容 | User login failed |
%n | 换行符 | (系统相关的换行符) |
%M | 方法名(性能损耗高,慎用) | doGet |
%l | 代码位置(类+方法+行号,性能低) | com.example.MyClass.main(MyClass.java:10) |
2. JSONLayout
将日志输出为JSON格式,便于ELK等日志分析系统处理。
示例配置:
<Console name="Console" target="SYSTEM_OUT"><JsonLayout complete="true" compact="false"/> </Console>
输出示例:
{"time": "2023-10-01T14:30:22.123Z","level": "ERROR","logger": "com.example.MyClass","message": "Database connection failed","thread": "main","stackTrace": "..." }
3. CSVLayout
以CSV格式输出日志,适合导入Excel分析。
示例配置:
<File name="File" fileName="logs/app.log"><CsvLayout delimiter="," header="time,level,logger,message"/> </File>
输出示例:
2023-10-01 14:30:22,ERROR,com.example.MyClass,"Database connection failed"
4. HTMLLayout
生成HTML格式的日志文件,支持颜色高亮。
示例配置:
<File name="HtmlFile" fileName="logs/app.html"><HTMLLayout title="MyApp Logs"/> </File>
输出效果:
(浏览器中打开,错误日志显示为红色)
5. XMLLayout
生成结构化XML日志。
示例配置:
<File name="XmlFile" fileName="logs/app.xml"><XMLLayout/> </File>
输出示例:
<Event timestamp="1696163422123" level="ERROR"><Logger>com.example.MyClass</Logger><Message>Database connection failed</Message> </Event>
三、日志级别与格式的典型组合
1. 开发环境(DEBUG级别 + 详细Pattern)
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}:%L - %msg%n"/>
输出:
14:30:22.123 [main] DEBUG com.example.MyClass:42 - User ID: 12345
2. 生产环境(INFO级别 + JSON格式)
<JsonLayout complete="true"/>
输出:
{"time":"2023-10-01T14:30:22Z","level":"INFO","message":"Server started on port 8080"}
3. 警告监控(WARN级别 + 邮件通知)
<SMTP name="Mail" subject="App Alert" to="admin@example.com"><PatternLayout pattern="%d %-5level %msg"/><ThresholdFilter level="WARN" onMatch="ACCEPT"/> </SMTP>
四、注意事项
-
性能影响:
-
避免在高频日志中使用
%M
(方法名)或%l
(行号),它们会显著降低性能。
-
-
日志级别选择:
-
生产环境通常用
INFO
,开发环境用DEBUG
或TRACE
。
-
-
敏感信息过滤:
-
使用
%replace
或自定义过滤器隐藏密码等敏感数据:<PatternLayout pattern="%replace{%msg}{password=.*?,}{password=***}%n"/>
-
总结
-
日志级别:控制日志的详细程度(从
OFF
到ALL
)。 -
日志格式:决定日志的呈现方式(如
PatternLayout
、JSONLayout
)。 -
最佳实践:根据环境选择级别和格式,平衡可读性与性能。