java 的 logback 应用程序

237 阅读3分钟

Logback ConsoleAppender通过System.outSystem.err打印流追加到控制台上。在这个Logback教程中,学习默认配置的控制台日志和如何应用自定义配置

1.1.依赖性

Logback在应用程序运行时需要三个模块,即logback-corelogback-classicslf4j-api

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.2.10</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.10</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.32</version>
</dependency>

logback-classic模块已经实现了SLF4J的API,所以在调用SLF4J的记录器来记录使用底层Logback库的消息时,没有额外的成本。

注意,logback-classic 会自动拉入logback-coreslf4j-api ,所以添加 logback-classic 依赖关系即可。

2.零配置控制台日志

默认情况下,如果我们不提供任何配置并在项目中添加依赖项,Logback会自动配置控制台appender并在控制台输出日志。

默认的日志级别设置为DEBUG。这意味着所有的INFOWARNERRORDEBUG信息将被打印在控制台。

下面的配置是Logback所做的等效配置,以防在classpath中没有找到自定义的配置文件

<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>

	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.howtodoinjava.demo.lombok.Article;

public class Main {
	public static void main(final String[] args) {
		Logger logger = LoggerFactory.getLogger(Main.class);

		logger.debug("Debug Message Logged !!!");
		logger.info("Info Message Logged !!!");
		logger.error("Error Message Logged !!!", new NullPointerException("Something is NULL"));

		Article a = Article.builder(1L).title("Test Article").tag("Data").build();
		logger.info("Article fecthed for id : {} is : {}", 1, a);
	}
}
15:23:27.810 [main] DEBUG com.howtodoinjava.demo.slf4j.Main - Debug Message Logged !!!
15:23:27.812 [main] INFO  com.howtodoinjava.demo.slf4j.Main - Info Message Logged !!!
15:23:27.813 [main] ERROR com.howtodoinjava.demo.slf4j.Main - Error Message Logged !!!
java.lang.NullPointerException: Something is NULL
	at com.howtodoinjava.demo.slf4j.Main.main(Main.java:14)
15:23:27.814 [main] INFO  com.howtodoinjava.demo.slf4j.Main - Article fecthed for id : 1 is : Article(id=1, title=Test Article, tags=[Data])

3.自定义配置

3.1.日志级别和模式

  • 我们可以在encoder 标签的帮助下自定义日志信息模式
  • 我们可以使用target 属性将默认目标System.out改为System.err
  • 改变日志级别,可以将level 属性改为任何其他的日志级别,如INFO、WARN或ERROR。

下面是更改后的配置样本。

<configuration>
  <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender" target="System.err">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDERR" />
  </root>
</configuration>

3.2.彩色编码的日志

要启用彩色编码的日志,请将withJansi 属性设置为true。默认情况下,它被设置为false

注意,基于Unix的操作系统,如Linux和Mac OSX,默认支持ANSI颜色代码。在Windows上,我们必须在运行时中添加jansi依赖性。

<dependency>
    <groupId>org.fusesource.jansi</groupId>
    <artifactId>jansi</artifactId>
    <version>2.4.0</version>
</dependency>

Spring boot会自动检测并配置颜色编码的日志。我们可以使用属性spring.output.ansi.enabled ,通过设置ALWAYS、NEVER或DETECT(默认值)来进一步定制它。

如果我们不想在项目中添加依赖性,而是在IDE中进行修改,这样他们就纯粹是在开发环境中,我们可以使用Eclipse Console插件中的ANSI

最后,使用一个启用了彩色编码的编码器模式。

<encoder>
  <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
</encoder>

在控制台中看到彩色编码的日志。

4.总结

默认配置的控制台日志对于入门和POC目的来说已经足够好了。

要在控制台中使用广泛和更详细的日志记录,我们可以自定义日志级别、模式,甚至可以为信息添加颜色编码。

学习愉快!!