Java程序猿修炼之道 之 Logging(1/3) - Logback 配置
写在前面的话:
作为《Java程序猿修炼之道》博文的第一个主题Logging,我计划中依照例如以下三篇来写:
- Logback的简介和配置
- 在Java代码中怎样使用SLF4J来写日志以及写日志的要点
- 作为一个程序猿,在日常工作中怎样分析和挖掘Log。
PS:默认生成的文件夹不正确,细致检查过了,我的h1,h2,h3,h4用的都没错。
1. 缘起
写代码中的日志是一个除了用代码实现功能之外最基础最基础的一个技能了,是一个必须掌握的技能。可是眼下为止。关于怎样日志的文章和书籍还是不多。
1.1 写日志的必要性
碰到QA提的一个bug的时候,我见识过两种方式的答复:a)请给我重现步骤和重现数据;b)把当时的日志给我。答复前者的,一般须要花非常多时间去找问题出如今那里,假设是别人开发的模块的话,花费的时间很多其它。答复后者的,一般能非常快的找到出问题的点。然后就能够開始进入修复的流程。
从概念上来说:日志是一个可执行的、可维护的软件的基础组成部分;通过日志,我们能够了解软件系统在执行中的实时状态,历史状态和异常状态等。
一个没有良好日志的软件是全部人的噩梦。
想象一下。你开发中使用的框架,比方Spring之类的。假设没有日志的话,你还会用吗?(感谢@ix_fly网友的这个建议)
假设你不想给自己找麻烦,你还是把日志好好写写。
1.2 为什么选Logback?
原因有俩:
- 我近期几年用的都是Logback
- 在前几天Log4j 2.0出来之前。logback的Logger用得比較爽
2. 怎样配置Logback
2.1 Logback简介
简单来说就是Log4j 1流行了,发现有一些问题是无法解决的,于是又出来了Logback,在Log4j的基础上提升了性能。提高了功能等等。只是前几天有出来了Log4j 2,据说是相对于Logbak来说又提升了性能提高了功能。
2.2 关于SLF4J和Logback
SLF4J(slf4j.org)又称Simple Logging Facade for Java,是一个通用的logging接口,它试图一统Logging框架的天下,兼容了(Log4j 1, java.util.logging和Jakarta Commons Logging)这三个最流行的Logging框架。Logback就是SLF4J的默认实现。
2.3 依赖包导入
普通情况下,你依照我以下说的就能够了,假设不行的话,你能够去翻翻英文的文档:http://logback.qos.ch/setup.html。
2.3.1 一般程序
Maven版
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.2</version> </dependency>
非Maven版
把http://logback.qos.ch/dist/logback-1.1.2.zip下载下来之后。在其根文件夹下有logback-core-1.1.2.jar和logback-classic-1.1.2.jar这俩个Jar。在logback-examples\lib下有slf4j-api-1.7.6.jar这个jar,把这三个Jar加入到你的代码包路径中。
2.3.2 非独立执行程序
假设你做的是一个Lib或者API。那么你就不应该依赖于详细的slf4j实现。
所以你对logback的依赖应该是在执行測试代码的时候,详细实现方式例如以下文所看到的:
Maven版
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.6</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.2</version> <scope>test</scope> </dependency>
当然了你是要把版本号信息放在pom.xml中的<dependencies>还是<dependencyManagement>里面就你自己决定吧。
非Maven版
在公布的时候不要把仅仅有Logback才用到jar打包进你的公布程序里面。
(假设认为绕口再多读两遍)
2.4 与遗留Logging框架兼容
眼下行业除了Logback之外,广泛使用的还有其它四种Logging框架:
- Log4j 1 (http://logging.apache.org/log4j/1.2/)
- Log4j 2 (http://logging.apache.org/log4j/2.x/)
- java.util.logging (http://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html)
- Apache commons Logging (http://commons.apache.org/proper/commons-logging/)
Log4j 2由于是刚出来的,眼下SLF4J对其的兼容性还未知,对于其它的三种框架。SLF4J都提供了兼容性的支持。以下介绍了怎样让Logbak兼容这些框架,另外。也能够阅读官方说明:http://www.slf4j.org/legacy.html
2.4.1 兼容Log4j 1和Apache Commons Logging
SLF4J对于Log4J 1和Apache commons Logging的支持方式是提供了实现Log4j和Apache commons Logging接口的SLF4J实现。使用方式是
- 去取对Log4J和Apache commons Logging的Jar包的引用
- 引入SLF4J的相应接口的实现包。
2.4.1.1 移除引用
<dependency> <groupId>org.springframework.ldap</groupId> <artifactId>spring-ldap-core</artifactId> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency>
- 使用 mvn dependency:tree 命令,例如以下图所看到的,能够看出须要在org.springframework.ldap:spring-ldap-core中排除掉对Apache commons Logging的引用。
- 另外一种方式是使用Eclipse的m2e Maven插件。例如以下图所看到的,打开pom.xml文件后。选择Dependency Hierarchy标签。然后在Filter中输入logging或者log4j进行过滤,在左側的Dependency Hierarchy中使用右键菜单就能够自己主动过滤了。
2.4.1.2 Maven导入相应的SLF4J实现包
<!-- Log4j 的SLF4J 实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.6</version> </dependency> <!-- Apache commons Logging 的SLF4J实现 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.6</version> </dependency>
2.4.1.3 非Maven版导入相应的SLF4J实现包
直接删除掉log4j-1.**.jar和commons-logging-1.**.jar文件,把http://slf4j.org/dist/slf4j-1.7.6.zip下载下来,把压缩包里的log4j-over-slf4j-1.7.6.jar或者(和)jcl-over-slf4j-1.7.6.jar文件放到classpath中。
2.4.2 兼容java.util.logging
SLF4J的jul-to-slf4j模块实现了一个java.util.logging handler。该handler会把对java.util.logging的调用都转化成对SLF4J实现的调用。所以须要下面俩个步骤:
- 导入jul-to-slf4j模块
- 启用jul-to-slf4j模块
2.4.2.1 导入jul-to-slf4j模块maven版
<dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.6</version> </dependency>
2.4.2.2 导入jul-to-slf4j模块非Maven版
把http://slf4j.org/dist/slf4j-1.7.6.zip下载下来,把压缩包里的jul-to-slf4j-1.7.6.jar放到classpath中。
2.4.2.3 启用jul-to-slf4j模块
在logging.properties中加入例如以下一行:
handlers = org.slf4j.bridge.SLF4JBridgeHandler
2.5 Logback 配置文件简单介绍
2.5.1 Logback配置文件名、位置和编写策略
Logback 会依照例如以下的顺序在classpath中读取配置文件,假设读取到不论什么一个,则停止继续寻找。
- logback.groovy 这个是使用groovy语法的配置文件
- logback.-test.xml
- logback.xml
默认配置例如以下:
- 输出格式
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
- 输出方向:System.out
- 输出级别:Debug
- 在src/test/resources文件夹中放置logback-test.xml,该配置文件里log的输出是到输出到console,对于本应用的代码是debug级别。对于其它的是info级别。
- 在src/main/resources文件夹中放置logback.xml,该配置文件里log的输出是输出到文件里,该文件每日滚动压缩打包备份,对于本应用的代码是info级别。对于其它的是warn级别。
- 对于web项目,logback.xml放置到WEB-INF/classes文件夹下。配置方式建议參考上面说的
- 对于其它项目。放置到应用启动执行时的classpath根文件夹下
2.5.2 Logback配置文件演示样例
<?xml version="1.0" encoding="UTF-8"?logback-test.xml> <configuration scan="true" scanPeriod="30 seconds"> <!--Appendar具体解释: http://logback.qos.ch/manual/appenders.html#RollingFileAppender --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 当前Log文件名称 --> <file>ldap-pwd.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 非当天的Log文件压缩备份为 archive/ldap-pwd.2014-08-10.zip --> <fileNamePattern>archive/ldap-pwd.%d{yyyy-MM-dd}.zip</fileNamePattern> <!-- 超过30天的备份文件会被删除 --> <maxHistory>30</maxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <!-- 格式说明:http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout --> <Pattern>%d [%thread] %-5level %40logger{40} - %msg%n</Pattern> </layout> </appender> <logger name="cn.justfly.training.logging" level="info" /> <root level="warn"> <appender-ref ref="FILE" /> </root> </configuration>
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d [%thread] %-5level %40logger{40} - %msg%n</pattern> </encoder> </appender> <logger name="cn.justfly.training.logging" level="debug" /> <root level="info"> <appender-ref ref="Console" /> </root> </configuration>