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配置:
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:指定日志分包策略。
配置文件事例:
日志文件的格式:
%d是时间,%thread线程名称, %-5Level : 等级,从左到右取5个字符宽度,%logger 类的名称,%msg,消息内容,%n换行符
3 java代码中的使用
如果出现:
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 自动对自己进行配置,这会导致记录输出到控制台。
日志接口库
(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 自动对自己进行配置,这会导致记录输出到控制台。
相关文章推荐
- java&javaweb学习笔记(汇总)
- Bravo!Java学习笔记(1)---接口、抽象类、对象克隆、内部类
- javaweb入门笔记(6)-JSP技术
- javaweb入门笔记(5)-cookie和session
- java移位操作符注意的问题
- javaweb入门笔记(3)-Servlet
- Eclipse 文本编辑快捷键
- java基础巩固笔记(5)-多线程之线程并发库
- java基础巩固笔记(5)-多线程之共享数据
- Java并发编程(三)volatile域
- Java并发编程(三)volatile域
- Java并发编程(三)volatile域
- Java 堆,栈, 常量池
- java,dex 文件编译反编译
- java基础巩固笔记(5)-多线程之传统多线程
- JAVA 冒泡法排序
- javacv
- Java 回顾笔记 1
- 理解java设计模式之建造者模式
- java构造器分析