您的位置:首页 > 编程语言 > Java开发

Java日志框架

2016-02-13 18:17 661 查看
java常用的日志框架:

日志接口库

(1) slf4j

即简单日志门面(Simple Logging Facade for Java), 不是具体的日志解决方案,它只服务于各种各样的日志系统,允许最终用户在部署其引用时使用其所希望的日志系统。

(2) common-logging(JCL)

为众多的具体的日志实现库提供一个统一的接口,它允许在运行时绑定到任意的日志库。但由于它使用了ClassLoader寻找和载入底层的日志库,这导致想OSGI这样的框的框架无法正常工作。

slf4j 和 common-logging相比:

common-logging在运行时通过动态查找机制自动找出真正使用的日志库,而slf4j则是在部署的时候就确定了使用的日志库,目前slf4j用的更多一些。

日志实现库:

(1) log4j

log4j是apache下的一个功能非常丰富的java日志实现库。通过使用Log4j, 我们可以控制日志信息输送的目的地是控制台,文件,GUI组件,甚至是套接口服务器,NT的事件记录器。用户也可以控制每一条日志的输出格式,它主要有两个版本,1.2和2.x。

(2) logback

Logback是作为Log4j的替代者出现,在很多方面相比log4j更优秀。

logback当前分成三个模块:logback-core, logback-classic 和 logback-access。

logback-core是核心,logback-classic是log4j的一个改良版本,实现了slf4j API。logback-access访问模块与servle 容器集成提供通过http来访问日志的功能。

(3) java.util.logging (JUL)

java1.4 及以上版本自带的日志库实现。与log4j相比,功能要少一些。

logback和log4j的比较:

记录日志的性能更高,创建记录器(Logger)的速度也更快,文档全部免费提供。

绑定器:

slf4j-XXX-version, xxx可以是log4j12,jcl,他们实现了跟具体的日志工具(比如log4j)的绑定及代理工作。

桥接器:

应用代码中使用别的日志接口,转成slf4j。XXX-over-slf4j。

把他们的日志重定向到SLF4J,所谓的桥接器就是一个假的日志实现工具,比如当你把jcl-over-slf4j放到CLASS_PATH时,即使某个组件原本是通过JCL输出日志的,现在也会被jcl-over-slf4j “骗到” slf4j里,然后slf4j又会根据绑定器把日志交给具体的日志实现工具。

Component

|

| log to Apache Commons Logging

V

jcl-over-slf4j.jar --- (redirect) ---> SLF4j ---> slf4j-log4j12-version.jar ---> log4j.jar ---> 输出日志

sfl4j的绑定:



slf4j的桥接:



slf4j+logback使用实例:

1 需要的jar包:

slf4j-api, logback-core, logback-classic

maven配置:

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.4</version>
</dependency>


2 logback.xml

logback.xml文件配置详解:

(1) 根节点

<configuration></configuration>

(2) 跟节点的子节点:

<contextName> ——上下文名称。每个logger都关联到logger上下文,默认上下文名称为default。一旦设置,不能修改。

<propery>——定义属性值的标签。有两个属性name和value

<loger>——用来设置某一个包或者具体的某一个类的日志打印级别,以及指定<appender>。

name:用来指定受此loger约束的某一个包或者具体的某一个类。

level:用来设置打印级别。大小写无关。TRACE,DEBUG,INFO,WARN,ERROR,ALL和OFF。如果未设置此属性,那么当前logger将会继承上级的级别。

addtivity:是否向上级loger传递打印信息,默认是true。

<root>——他是根loger,只有一个level属性。

<logger>和<root>可以包含零个或者多个<appender-ref>元素,标识这个appender将会添加到这个loger。

logger:作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型和级别。

appender:主要用于指定日志输出的目的地,目的地可以是控制台,文件,远程套接字服务器。

encode:指定日志格式

rollingPolicy:指定日志分包策略。

配置文件事例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志环境变量 -->
<property name="LOGS_HOME" value="${logs.home}"/>
<property name="LOG_LEVEL" value="${logs.level}"/>

<contextName>${app.name}</contextName>

<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{120} - %msg%n</pattern>
<charset>${app.charset}</charset>
</encoder>
</appender>

<!-- STATISTIC -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logs.home}/mylog.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logs.home}/mylog.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>

<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{120} - %msg%n</pattern>
<charset>${app.charset}</charset>
</encoder>
</appender>

<!-- PURCHASE_FLOW_LOG -->
<logger name="com.myclass" level="INFO" additivity="true">
<appender-ref ref="FILE"/>
</logger>

<!-- 输出日志控制 -->
<root level="${logs.level}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>

</configuration>


日志文件的格式:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

%d是时间,%thread线程名称, %-5Level : 等级,从左到右取5个字符宽度,%logger 类的名称,%msg,消息内容,%n换行符

3 java代码中的使用

public class BlogAction{
//定义一个全局的记录器,通过LoggerFactory获取
private final static Logger logger = LoggerFactory.getLogger(BlogAction.class);
/**
* @param args
*/
public static void main(String[] args) {
logger.info("logback 成功了");
logger.error("logback 成功了");
}
}


如果出现:

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/D:/Users/mzang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/D:/Users/mzang/.m2/repository/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

则表示有多个可用的slf4j的绑定,解决方式,排除slf4j-log4j12-1.7.5.jar的,即可成功绑定到logback-classic。

Logback默认配置的步骤

(1) 尝试在classpath下查找文件logback.groovy

(2). 尝试在 classpath 下查找文件 logback-test.xml;

(3). 如果文件不存在,则查找文件 logback.xml;

(4). 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: