将slf4j
库用作Java应用程序日志记录API层有很多好处。 在这里,我将展示一些示例,说明如何与不同的记录器一起使用和配置它。
您可以将slf4j
视为Java接口,然后在运行时需要一个实现(仅一个)来提供实际的日志记录详细信息,例如写入STDOUT或文件等。每个日志记录实现(或称为绑定)都将显然,它们具有配置日志输出的方式,但是您的应用程序将保持不可知状态,并始终使用相同的org.slf4j.Logger
API。 让我们看看这在实践中是如何工作的。
在简单记录器中使用
在pom.xml
创建一个基于Maven的项目。
<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);elseLOGGER.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
仅使用“ NOP”实现,而没有执行任何操作。 为了正确查看输出,您可以尝试使用根本不需要任何配置的简单实现! 只需返回您的pom.xml
并添加以下内容:
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.5</version></dependency>
现在,您将看到在INFO级别的STDOUT上记录输出。 这个简单的记录器将默认显示任何INFO级别或更高级别的消息。 为了查看DEBUG消息,您需要在Java启动时传递此系统属性-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG
。
在Log4j记录器中使用
现在,我们可以尝试并交换不同的记录器实现,但是您的应用程序代码可以保持不变。 我们需要的是用另一个流行的记录器实现(例如Log4j)替换slf4j-simple
。
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version></dependency>
同样,我们必须为选择的每个实现配置日志记录。 在这种情况下,我们需要一个src/main/resources/log4j.properties
文件。
log4j.rootLogger=DEBUG, STDOUTlog4j.logger.deng=INFOlog4j.appender.STDOUT=org.apache.log4j.ConsoleAppenderlog4j.appender.STDOUT.layout=org.apache.log4j.PatternLayoutlog4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
重新运行您的程序,您应该会看到类似的输出。
将
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
,以便它进行选择。起来 这是一个入门的示例:
等级= INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST
结合使用
logback记录器实现是超级dupa质量实现。 如果您打算编写投入生产的严肃代码,则可能需要评估此选项。 再次修改您的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>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender>
<logger name="deng" level="DEBUG"/>
<root level="INFO"><appender-ref ref="STDOUT" /></root>
</configuration>
使用
如果要提供供大型最终用户使用的Java库,则最好将项目设置为仅依赖slf4j-api
,然后让用户在其开发或运行时环境中选择任何记录器实现。 作为最终用户,他们可以快速选择上述选项之一,并充分利用自己喜欢的日志记录实现功能。
资源资源
- http://slf4j.org/
- http://logging.apache.org/log4j/1.2/
- http://docs.oracle.com/javase/7/docs/technotes/guides/logging/
- http://logback.qos.ch/
翻译自: https://www.javacodegeeks.com/2013/08/how-to-configure-slf4j-with-different-logger-implementations.html