上一篇文章讲了log4j的使用,作为log4j的新一代产品logback 无疑在将来有着更大的市场和应用。
log4j:
http://wangxinchun.iteye.com/blog/2094046
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来访问日记的功能。
logback的优势:
1、功能更强大,更全面,更灵活。(这是迁移到logback的根本原因)
2、较好的性能。(据说了,没有测试过)
Logback默认的读取步骤:
(1). 尝试在 classpath 下查找文件 logback-test.xml;
(2). 如果文件不存在,则查找文件 logback.xml;
(3). 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。
logback 是基于xml 配置的,没有官方的schema。
最外层的标签是:configuration 其,但是其默认对应的xml schema 图如下:
如上图所示,configuration 最重要的配置标签有:appender,logger,root
logger :代表一个日志记录的规则。它指定哪些名字(有继承规则)的log,输出哪些level的日志,以及输出的最终appender。
name: 是必须的属性,一般是包名,类名通过.连接组成的一个字符串。
level :可选的属性,如果没有设置自然继承父包的level属性,以此类推到root的level。
additivity:可选的属性,默认设置为true,如果设置为false,那么log仅仅输出到logger的appender-ref,不再输出的父logger的appender-ref,当然root的appender-ref也不会输出的。
logger 和 level的 继承关系如下:
logger 和 additivity 的关系如下:
eg:
logger.debug("hello {} ", "world");
logger.info("hello {} ", "world");
logger.warn("hello {} ", "world");
logger.error("hello {} ", "world");
<logger name="com.qunar.logback.LogbackTest" additivity="false" level="ERROR">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
输出:
1、additivity = false : 只有FILE输出了ERROR级别的日志。STDOUT没有输出。
2、additivity = true:FILE 和STDOUT 都有ERROR日志的输出。
另外注意:com.qunar.logback.LogbackTest对应的logger的 level 设置为debug,而root对应的level为INFO,但是文件输出中有debug。那么说明
logger的level覆盖了root 的level设置。
root:代表一个root logger,它的含义本质依然是一个logger,只是比较特殊所以单独设置一个root标签,这样root logger 也就不需要普通logger所需要的name属性,root有且仅有一个level属性,默认是debug,它不支持其他的任何属性。不过root 可以拥有0或在n个<appender-ref> 元素。
appender:含义为输出的媒介,比如命令行,文件或在数据库等等。英文为:an output destination is called an appender appenders exist for the console, files, remote socket servers, to MySQL, PostgreSQL, Oracle and other databases, JMS, and remote UNIX Syslog daemons.
规则1、一个logger请求(debug,info,error),会输出到logger关联的所有的appender,当然logger的父logger也会输出。
eg:
import org.slf4j.LoggerFactory;
public class LogbackTest2 {
public static final Logger x = LoggerFactory.getLogger("a.x");
public static final Logger y = LoggerFactory.getLogger("a.y");
@Test
public void testLogback() {
x.info("hello {} ", "world");
y.info("hello {} ", "world");
}
}
logback.xml
<logger name="a" additivity="false" level="info">
<appender-ref ref="FILE" />
</logger>
输出:
2014-07-22 21:00:19,835 INFO [main] a.x [LogbackTest2.java:14] hello world
2014-07-22 21:00:19,842 INFO [main] a.y [LogbackTest2.java:15] hello world
上面这个例子说明了:x 和 y 是 a 的子log。所以x 和 y的请求都在 a对应的appender 中输出了。
规则2:
appender的配置相对复杂,相应的配置也是重点和难点。
appender对于的schema 如下:
maven 引入 logback 和slf4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
案例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<contextName>myAppName</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
</appender>
<logger name="com.qunar.logback.LogbackTest" level="DEBUG" />
<logger name="com.qunar.logback.LogbackTest2" additivity="false">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
其他:
1、设置全局属性。其他地方可以直接使用%name
<contextName>myAppName</contextName>
eg:
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
2、timestamp 标签时间戳。
<timestamp key="byHH" datePattern="yyyy-MM-dd-HH"/>
比如要根据每个小时生成一个日志文件的需求:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log-${byHH}.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
</appender>
- 大小: 2.9 KB
- 大小: 4.4 KB
- 大小: 308.9 KB
- 大小: 69.7 KB
分享到:
相关推荐
SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志抽象层,它为各种日志框架,如Log4j、java.util.logging、Logback等提供了一个统一的接口。通过SLF4J,开发者可以在不修改代码的情况下更换底层的...
2. **选择绑定**: 开发者可以通过在类路径中包含特定的日志实现JAR来选择使用哪个日志系统,例如logback-classic.jar会选择logback作为SLF4J的实现。 总之,SLF4J提供了一种灵活的日志抽象层,允许开发者在不影响...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。这个接口使得应用程序的代码与...
SLF4J的主要目的是为各种日志框架,如log4j、logback等,提供一个统一的接口,使得应用程序可以独立于具体的日志实现进行开发,提高了代码的可移植性和灵活性。 标题中的"slf4j-log4j12-1.7.12.jar"是SLF4J的一个...
SLF4J(Simple Logging Facade for Java)是Java中一个重要的日志接口框架,它为各种日志实现提供了一个抽象层,使得开发者能够在运行时动态地选择具体使用的日志实现,例如Log4j、Java Util Logging (JUL)、Logback...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供了一个统一的接口。SLF4J的设计目标是允许最终用户在部署其应用程序时插入所需的日志库。这样,开发者...
SLF4J的出现是为了统一各种日志框架,如Log4j、java.util.logging、Logback等,使得在不同的项目中可以方便地更换日志系统,而无需修改代码。 标题中的"slf4j-api-1.7.30.jar"指的是SLF4J API的1.7.30版本的jar包。...
SLF4J(Simple Logging Facade for Java)是Java日志记录的一个接口层,它为各种日志框架,如Log4j、Java Util Logging、Logback等,提供了一个抽象层。`slf4j-api-1.7.25`是SLF4J API的一个版本,其中`1.7.25`代表...
SLF4J提供了一个抽象层,允许开发人员在不修改代码的情况下切换不同的日志框架,如Log4j、Logback等。而Log4j12则是Apache Log4j的第二个主要版本,它提供了丰富的日志记录功能和性能优化。 SLF4J的核心思想是引入...
SLF4J(Simple Logging Facade for Java)是Java日志记录的一个接口层,它为各种日志框架,如Log4j、Logback等提供一个简单的抽象层,使得最终用户能够在部署时插入所需的日志实现。`slf4j-api-1.7.7.jar`是SLF4J ...
如果你的项目中已经有了其他日志实现,例如logback,那么应该使用对应的绑定包,如slf4j-logback1.x.jar,而不是slf4j-simple。 在压缩包文件名称列表中仅提到"slf4j",这可能意味着压缩包中包含了SLF4J API和其他...
在实际开发中,SLF4J通常与具体的日志实现一起使用,比如Log4j、Logback等。通过SLF4J,开发者可以在不修改代码的情况下,切换不同的日志实现,这对于多模块项目尤其有用,因为每个模块都可以依赖SLF4J,而项目的...
SLF4J的出现旨在解决Java日志库的混乱状况,为各种日志框架(如Log4j、Logback、Java Util Logging等)提供一个抽象层,使得应用程序可以在不修改代码的情况下切换日志实现。 "slf4j-api-1.7.28.jar"是SLF4J API的...
SLF4J(Simple Logging Facade for Java)是Java中一个简单日志门面的接口,它为各种日志框架提供了统一的API,比如Log4j、Java Util Logging、Logback等。`slf4j-api.jar`是SLF4J的核心API,包含了各种日志记录方法...
SLF4J (Simple Logging Facade for Java) 是一个用于各种日志框架的简单抽象,例如java.util.logging、Logback 和 Log4j。它的主要目的是为应用程序提供一个可插入的日志接口,允许最终用户在部署时插入所需的日志库...
SLF4J(Simple Logging Facade for Java)是一个用于各种日志框架的简单抽象,例如java.util.logging、Logback和Apache Log4j。它为所有这些日志库提供了一个统一的API,允许最终用户在部署时插入所需的日志库。SLF4...
SLF4J(Simple Logging Facade for Java)是Java日志记录的一个接口层,它为各种日志框架,如Log4j、Java Util Logging、Logback等,提供了一个统一的API。SLF4J的主要目的是使得应用程序可以在部署时选择任意的日志...
SLF4J(Simple Logging Facade for Java)是Java日志记录的一个接口层,它为各种日志框架,如Log4j、Logback等提供了一个统一的API,使得开发者可以在项目开发过程中方便地更换日志实现。这个标题提到的是两个SLF4J...
SLF4J的主要目标是提供一个简单易用的日志接口,它不关心具体的日志实现,而是允许开发者在部署时通过绑定特定的日志实现库(如Logback、Log4j等)来满足日志记录需求。这样做有几个显著的优点: 1. **灵活性**:...