第0章:简介
(1)简单日志门面slf4j
1.SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
2.使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。
3.SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
4.SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
5.参考网站:
官方文档:http://www.slf4j.org/docs.html
开源中国:http://www.oschina.net/p/slf4j/
百度百科搜“slf4j”
(2)日志组件log4j
1.Log4j(log for java)是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。
2.通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
3.参考网站:
官网:http://logging.apache.org/log4j/2.x/
官方文档:http://logging.apache.org/log4j/1.2/manual.html
开源中国:http://www.oschina.net/p/log4j
百度百科搜“log4j”
(3)日志组件logback
1.Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
2.logback比现有任何记录系统更快、占用资源更少,有时差距非常大。Logback-core附带了Joran,Joran是个强大的、通用的配置系统,你可以在自己的项目里使用Joran以获得巨大的作用。
3.参考网站:
官方文档:http://logback.qos.ch/documentation.html
开源中国:http://www.oschina.net/p/logback/
博客:
http://wenku.baidu.com/view/dbe7da1dc5da50e2524d7fb0.html
http://wenku.baidu.com/view/71a056eb0975f46527d3e138.html
http://yuri-liuyu.iteye.com/blog/954038
http://www.cnblogs.com/yongze103/archive/2012/05/05/2484753.html
http://blog.csdn.net/mydeman/article/details/6716925
第1章:slf4j
(1)slf4j使用步骤
1.直接从官网http://www.slf4j.org/download.html下载slf4j-api-1.7.5.jar包放到项目classpath中,或者通过maven依赖配置从中央仓库中获取,坐标如下:
<!-- slf4j日志门面 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> |
2.编写测试代码。如下
结构:
pom.xml配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lsl</groupId> <artifactId>test-maven</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <name>test-maven</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 设定除中央仓库(repo1.maven.org/maven2/)外的其他仓库,按设定顺序进行查找. --> <repositories> <!-- 本地仓库 --> <repository> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public</url> <releases> <checksumPolicy>fail</checksumPolicy> </releases> <snapshots> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <!-- 设定团队持续集成发布包服务器 --> <distributionManagement> <repository> <id>rcms_release</id> <name>rcms_release</name> <url>http://localhost:8081/nexus/content/repositories/rcms_release/</url> </repository> <snapshotRepository> <id>rcms_snapshots</id> <name>rcms_snapshots</name> <url>http://localhost:8081/nexus/content/repositories/rcms_snapshots/</url> <uniqueVersion>false</uniqueVersion> </snapshotRepository> </distributionManagement> <dependencies> <!-- 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> </dependencies> <build> <finalName>test-maven</finalName> <plugins> <!-- JDK編译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> <!-- 源码打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <configuration> <attach>true</attach> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <!-- 把依赖的jar包拷到lib目录下 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependency</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.basedir}/lib</outputDirectory> <overWriteReleases>true</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> |
package com.lsl.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Hello world! * */ public class Slf4jTest { private static final Logger logger = LoggerFactory.getLogger(Slf4jTest.class); public static void main( String[] args ) { logger.info("Hello World"); } } |
3.如果现在运行测试,控制台将会打印下面信息,原因是slf4j绑定不到classpath。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.4.为了可以正常打印日志,需加上slf4j的slf4j-simple-1.7.5.jar包用于绑定classpath,该包同样可以在官网下载,或通过如下maven配置获取:
<!-- slf4j日志绑定 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency> </dependencies> |
5.运行测试,控制台打印日志如下,slf4j运用测试完成:
[main] INFO com.lsl.test.Slf4jTest - Hello World
(2)slf4j门面示意图
第2章:log4j
(1)log4j使用步骤
1.直接从官网http://logging.apache.org/log4j/1.2/download.html下载log4j-1.7.5.jar包放到项目classpath中,或者通过maven依赖配置从中央仓库中获取,坐标如下:
<!-- log4j日志组件 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> |
2.配置log4j.properties文件。将该配置文件放到classpath中系统会自动加载,要求配置文件名称为“log4j.properties”;或在日志调用前加载,该方式文件名称和路径可以自定义,加载调用PropertyConfigurator.configure("配置文件路径")。文件配置例子如下,具体解释在下一小节:
# Output pattern : date [thread] priority category - message log4j.rootLogger=WARN, Console, RollingFile #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #RollingFile log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.RollingFile.File=log/server.log log4j.appender.RollingFile.encoding=UTF-8 log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c:%L] - %m%n #Project defalult level log4j.logger.com.lsl=INFO log4j.logger.com.lsl.test=INFO |
3.编写测试类如下:
结构:
Log4jTest.java测试类:
package com.lsl.test; import org.apache.log4j.Logger; /** * Hello world! * */ public class Log4jTest { private static final Logger logger = Logger.getLogger(Log4jTest.class); public static void main( String[] args ) { logger.info("Hello World"); } } |
4.maven编译后运行测试类,控制台打印如下日志,测试成功:
2013-10-17 18:51:15,921 [main] INFO [com.lsl.test.Log4jTest] - Hello World
(2)log4j.properties配置说明
1.配置根Logger
格式:log4j.rootLogger = [ level ] , appenderName, appenderName, …
说明:level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
例子:log4j.rootLogger=WARN, Console, RollingFile
2.配置日志信息输出目的地 Appender
格式:log4j.appender.appenderName = fully.qualified.name.of.appender.class
说明:Appender 负责控制日志记录操作的输出。这里的appenderName为配置根Logger中定义的,可任意起名。Log4j提供的appender有以下几种:
还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。)
3.配置日志信息的格式(布局)Layout
格式:log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
说明:Layout 负责格式化Appender的输出。Log4j提供的layout有以下几种:
4.格式化日志信息
格式:log4j.appender.Console.layout.ConversionPattern=格式化
说明:og4J采用类似C语言中的printf函数的打印格式格式化日志信息,如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
5.日志文件路径
格式:log4j.appender.RollingFile.File=D:\\Tomcat 5.5\\logs\\qc.log
说明:定义名为RollingFile的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。
例子:log4j.appender.RollingFile.File=log/server.log
6.指定日志等级
格式:log4j.logger.com. neusoft =DEBUG
说明:指定com.neusoft包下的所有类的等级为DEBUG。
例子:log4j.logger.com.lsl=INFO
7.设置日志编码
格式:log4j.appender.RollingFile.encoding=UTF-8
说明:设置日志编码。
例子:log4j.appender.RollingFile.encoding=UTF-8
(3)log4j整合slf4j日志门面步骤
1.直接下载slf4j-api-1.7.5.jar和slf4j-log4j12-1.7.5.jar包放到项目classpath中,或者通过maven依赖配置从中央仓库中获取,坐标如下:
<!-- slf4j日志门面 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <!-- log4j与slf4j连接包,依赖关联了log4j-1.2.17.jar包,不用再单独配 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> |
2.log4j.properties配置同上节的配置,测试类有一点不同,如下:
项目结构同上节,测试类如下:
package com.lsl.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Hello world! * */ public class Log4jTest { private static final Logger logger = LoggerFactory.getLogger(Log4jTest.class); public static void main( String[] args ) { logger.info("Hello World"); } } |
3.打maven编译后运行测试,结果如下,测试成功:
2013-10-17 19:08:09,033 [main] INFO [com.lsl.test.Log4jTest] - Hello World
第3章:logback
(1)logback使用步骤
1.直接从官网http://logback.qos.ch/download.html下载解压获取logback-classic-1.0.13.jar、logback-core-1.0.13.jar包放到项目classpath中,再按前面的章节说明下载slf4j-api-1.7.5.jar包放在classpath中,或者通过maven依赖配置从中央仓库中获取,因为logback-classic依赖了logback-core和slf4j-api,所以可以只配置logback-classic依赖,坐标如下:
<!-- logback日志,依赖了logback-core和slf4j-api --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency> |
2.配置logback.xml文件。将该配置文件放到classpath中系统会自动加载,要求配置文件名称为“logback.xml”;或在日志调用前加载,该方式文件名称和路径可以自定义。文件配置例子如下,具体解释见:
http://wenku.baidu.com/view/dbe7da1dc5da50e2524d7fb0.html
http://wenku.baidu.com/view/71a056eb0975f46527d3e138.html
配置文件遍历顺序如下:
1).logback首先会试着查找logback.groovy文件;
2).当没有找到时,继续试着查找logback-test.xml文件;
3).当没有找到时,继续试着查找logback.xml文件;
4).如果仍然没有找到,则使用默认配置(打印到控制台)。
logback.xml配置例子如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n</pattern> </encoder> </appender> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/server.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logs/server.%d{yyyyMMdd}.log</fileNamePattern> <!-- keep 7 days' worth of history --> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n</pattern> </encoder> </appender> <logger name="com.lsl" level="INFO" additivity="false"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> </logger> <root level="WARN"> <appender-ref ref="Console"/> </root> </configuration> |
3.编写测试类如下:
结构:
LogbackTest.java测试类:
package com.lsl.test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.util.StatusPrinter; /** * Hello world! * */ public class LogbackTest { private static final Logger logger = LoggerFactory.getLogger(LogbackTest.class); public static void main( String[] args ) { logger.info("Hello World"); // LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); // StatusPrinter.print(lc); } } |
4.maven编译后运行测试类,控制台打印如下日志,测试成功:
11:21:04.946 [main] INFO [com.lsl.test.LogbackTest] - Hello World