如何配置SLF4J不同的日志实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置SLF4J不同的日志实现相关的知识,希望对你有一定的参考价值。
使用slf4j库作为你的Java应用日志API层有很多好处,这里我会展示一小部分关于如何使用和配置它的例子。你可以把slf4j想成一个Java的接口,然后你需要实现这个接口,从而在运行时提供实际的日志记录,例如把日志写到控制台(STDOUT)或者一个文件上等等。每种实现(或成为绑定)都显而易见地有他们自己的方式来配置日志的输出,但是你的应用对实现者并无感知并且一直使用相同的org.slf4j.Logger API。让我们看看如何在实际中使用它。
使用slf4j做简单的日志记录
创建基于Maven的工程,在pom.xml中添加如下内容
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
现在你可以在你的Java代码中这样使用Logger
package deng;
import org.slf4j.*;
public class Hello
static Logger LOGGER = LoggerFactory.getLogger(Hello.class);
public static void main(String[] args)
for (int i = 0; i < 10; i++)
if (i % 2 == 0)
LOGGER.info("Hello ", i);
else
LOGGER.debug("I am on index ", i);
以上代码可以编译通过,但是当你运行它时,你会看到这样的输出
bash> java deng.Hello
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.
上面的意思是,在运行时,你没有做日志的实现(或者说日志的绑定),所以slf4j简简单单的使用了一个什么也不会做的空实现。
为了看到正确的输出,你应该尝试使用一个简单(simple)的实现,这个实现根本不需要任何配置!只要回到pom.xml然后添加如下配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
现在你可以在控制台(STDOUT)看见INFO级别的日志输出了。这个简单的logger会默认显示任何INFO或者更高级别的信息。想要看DEBUG级别的信息,你需要在Java启动时传入这个系统属性(system property)
-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG
使用slf4j与Log4j日志
现在我们可以试验并更换不同的日志实现,但你的程序代码可以保持不变。
我们要做的是用另一个流行的日志实现来替换掉slf4j-simple,比如Log4j。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
又一次,我们必须对我们选的每一个日志实现做配置。在这个例子中,我们需要一个文件src/main/resources/log4j.properties。
log4j.rootLogger=DEBUG, STDOUT
log4j.logger.deng=INFO
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
重运行你的程序,你会看到同样的输出结果。
使用slf4j和JDK日志
JDK实际上带有一个日志包,你可以在pom.xml中替换为另一个日志实现。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.5</version>
</dependency>
现在JDK日志的配置起来有一点困难。这里不仅需要一个配置文件src/main/resources/logging.properties,你还需要添加一个系统属性
-Djava.util.logging.config.file=logging.properties
这是一个logging.properties的示例
level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST
使用slf4j和Logback日志
Logback日志实现是一个高质量的实现。如果你想在项目中写认真的代码,你会想要考虑这中方式。还是修改你的pom.xml文件,替换成这样
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
这是一个简单的配置src/main/resources/logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%dHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n</pattern>
</encoder>
</appender>
<logger name="deng" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
用slf4j写你自己的日志库
如果你正在很多终端用户(END USER)提供Java库,那么让你的项目仅依赖slf4j-api绝对是个好想法,然后让你的用户在他们开发和运营环境中选择任意的日志实现。作为终端用户,他们可以快速地从上面提到的日志库中选择一个,并且从他们自己喜欢的日志实现的特性中受益。 参考技术A
SLF4J是一套简单的日志外观模式的Java API,帮助在项目部署时对接各种日志实现。
LogBack在运行时使用JMX帮助修改日志配置,在生产状态下无需重启应用程序。
SLF4J是简单的日志外观模式框架,抽象了各种日志框架例如Logback、Log4j、Commons-logging和JDK自带的logging实现接口。
它使得用户可以在部署时使用自己想要的日志框架。SLF4J是轻量级的,在性能方面几乎是零消耗的。
SLF4J没有替代任何日志框架,它仅仅是标准日志框架的外观模式。
如果在类路径下除了SLF4J再没有任何日志框架,那么默认状态是在控制台输出日志。
Logback是Log4j的改进版本,而且原生支持SLF4J(因为是同一作者开发的),因此从其它日志框架如Log4j或JDK的logging迁移到Logback是完全可行的。
由于Logback原生支持SLF4J,因此Logback+SLF4J的组合是日志框架的最佳选择,比SLF4J+其它日志框架的组合要快一些。而且Logback的配置可以是XML或Groovy代码。
注意一个重要的特性,Logback通过JMX修改日志配置(比如日志级别从Debug调整到INFO),可以从JMX控制台直接操作,无需重启应用程序。
以上是关于如何配置SLF4J不同的日志实现的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hibernate 4 中配置日志记录以使用 SLF4J