Logger日志
日志主要是记录系统中相关问题及事件信息,可以通过这些信息排查错误的发生原因,一些事件的追踪,业务逻辑统计分析。好的日志可以省去开发者一大半的时间。
在个人那么多天的研究中,从开始对Logger一无所知,或者说有愚蠢的想法(不就简单的打印日志而已),到现在发现Logger体系如此美妙绝伦。
Logger日志常用框架
常用的实现框架:
- Log4j:Apache的开源项目,是一个功能强大的日志组件,提供方便的日志记录。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.29</version> </dependency>
- Logback:Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency>
- Log4j2:是log4j 1.x 的升级版,参考了Logback的一些优秀的设计,并且修复了一些问题,采取异步日志模式,解决了因日志造成的性能问题,带来了一些重大的提升。(值得推荐)
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>${log4j2.version}</version> </dependency>
- Common-logging:是apache提供的一个通用的日志接口。用户可以通过配置自由选择第三方的日志组件作为具体实现。
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
- Slf4j:类似于Apache Common-Logging,j是一个门面适配器,所有的日志代码都可以用slf4j方式,它会根据项目具体依赖的日志实现包进行日志操作,只需修改pom.xml文件中的日志实现依赖(已做好桥接包)
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version>
还有好多其他的框架不再一一介绍,使用什么框架主要还是看项目和人所适合的方向。
常用日志框架的性能比较--参考连接
Logger日志等级描述
对于标准级别它们关系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
之后我会对等级的动态调整做相应的文章进一步介绍
日志规约——参考阿里嵩山版
- 应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
- 在日志输出时,字符串变量之间的拼接使用占位符的方式。
logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);
- 避免重复打印日志,浪费磁盘空间,务必在日志配置文件中设置 additivity=false。
<logger name="com.taobao.dubbo.config" additivity="false">
-
生产环境禁止直接使用 System.out 或 System.err 输出日志或使用,标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小超过操作系统大小限制。
-
日志打印时禁止直接用 JSON 工具将对象转换成 String。如果对象里某些 get 方法被覆写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。
-
谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;如果使用warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。