java日志组件

来源:互联网 发布:java 代码单元测试 编辑:程序博客网 时间:2024/05/22 19:26

第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/

官方文档: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/

官方文档: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>

Slf4jTest.java测试类:

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 implementationSLF4J: 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有以下几种:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,
                                                                         还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
例子:log4j.appender.Console=org.apache.log4j.ConsoleAppender

3.配置日志信息的格式(布局)Layout

格式:log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

说明:Layout 负责格式化Appender的输出。Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
例子:log4j.appender.Console.layout=org.apache.log4j.PatternLayout

4.格式化日志信息

格式:log4j.appender.Console.layout.ConversionPattern=格式化

说明:og4J采用类似C语言中的printf函数的打印格式格式化日志信息,如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
例子:log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

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

原创粉丝点击