关于常见日志的几种级别和格式
一、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)。
-  最佳实践:根据环境选择级别和格式,平衡可读性与性能。 
