Logback

Logback Tutorial for Beginners

In this post, we feature a comprehensive Logback Tutorial. Logback is one of the most widely used logging frameworks in the Java community. It provides more options for configuration and more flexibility in archiving old log files. In this tutorial, I will demonstrate its three key components: Logger, Appender, and Layout.

 

1. Introduction

Most of Java applications rely on the logging messages to identify and troubleshoot problems. Logback is one of the most widely used logging frameworks in the Java community. It offers a faster implementation than Log4j, provides more options for configuration, and more flexibility in archiving old log files.

The Logback architecture includes three classes:

  • Logger – the class that the application interacts with to create log messages
  • Appender – the destination which holds log messages
  • Layout – the interface that prepares and formats the messages for outputting

Most Java applications log the messages via objects –Logger and configure Appenders with the desired layout pattern in a configuration file. In this example, I will build a Spring boot application to demonstrate the Logback’s fundamental functions:

  • How to log the messages
  • How to filter the log messages
  • Where to place the log messages
  • How to format the log messages

2. Technologies Used

The example code in this article was built and run using:

  • Java 1.8.101
  • Maven 3.3.9
  • Spring boot 2.0.3
  • Logback 1.2.3
  • Eclipse Oxygen

3. Spring Boot Application

There are many ways to create a Spring boot application. The easiest way for me is via the Spring starter tool with the steps below:

  1. Go to:https://start.spring.io/
  2. Select Maven Project, Java, and Spring Boot version 2.0.3
  3. Enter the group name as jcg.zheng.demo and the artifact name as logback-demo
  4. ClickGenerate Project

A maven project will be generated and downloaded to your workstation. Import it into your Eclipse workspace. There is no modification needed for the two generated files in this example.

3.1 Dependency

Pom.xml manages the project libraries.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>jcg.zheng.demo</groupId>
	<artifactId>logback-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>logback-demo</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

3.2 LogbackDemoApplication

LogbackDemoApplication.java starts the application.

LogbackDemoApplication.java

package jcg.zheng.demo.logbackdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LogbackDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(LogbackDemoApplication.class, args);
	}

}

4. Log a Message

There are only two steps to log a message with Logback:

  1. Obtain a Logger object from org.slf4j.LoggerFactory.
  2. Log a message based on the requirements.

4.1 DemoLog

In this step, I will create an abstract class: DemoLog, which logs five parameterized messages, one for each log level respectively.

DemoLog.java

package jcg.zheng.demo.logbackdemo.component;

import org.slf4j.Logger;

public abstract class DemoLog {
	
	public static void logStatements(Logger logger, String message) {
		logger.trace("log a trace message {}", message);
		logger.debug("log a debug message {}", message);
		logger.info("log a info message {}", message);
		logger.warn("log a warn message {}", message);
		logger.error("log an error message {}", message);
	}
}

4.2 TestComponent1

I will create a Spring bean –TestComponent1, which extends from DemoLogTestComponent1 has a Logger object created from org.slf4j.LoggerFactory‘s static method –getLogger. The logger name is set with TestComponent1 class’s name. It logs five messages in both @PostConstruct and @PreDestroy methods.

TestComponent1.java

package jcg.zheng.demo.logbackdemo.component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class TestComponent1 extends DemoLog{

	private static final Logger lOG = LoggerFactory.getLogger(TestComponent1.class);

	@PostConstruct
	public void setup() {
		DemoLog.logStatements(lOG, "-inside TestComponent1.setup() ");
	}

	@PreDestroy
	public void clean() {
		DemoLog.logStatements(lOG,"-inside TestComponent1.clean() ");
	}

}

4.3 TestComponent2

Repeat step 4.2 to create a TestComponent2 Spring bean.

TestComponent2.java

package jcg.zheng.demo.logbackdemo.component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class TestComponent2 extends DemoLog{
	private static final Logger lOG = LoggerFactory.getLogger(TestComponent2.class);


	@PostConstruct
	public void setup() {
		logStatements(lOG,"-inside TestComponent2.setup() ");
	}

	@PreDestroy
	public void clean() {
		logStatements(lOG,"-inside TestComponent2.clean() ");
	}
}

4.4 Demo

Execute java -jar target\logback-demo-0.0.1-SNAPSHOT.jar to start the LogbackDemoApplication. The log messages from both TestComponent1 and TestComponent2 will be placed in the system console.

application output

C:\gitworkspace\logback-demo>java -jar target\logback-demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

2018-07-20 15:23:15.023  INFO 4480 --- [           main] j.z.d.l.LogbackDemoApplication           : Starting LogbackDemoApplication v0.0.1-SNAPSHOT on SL2LS431841 with PID 4480 (C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar started by Shu.Shan in C:\gitworkspace\logback-demo)
2018-07-20 15:23:15.027  INFO 4480 --- [           main] j.z.d.l.LogbackDemoApplication           : No active profile set, falling back to default profiles: default
2018-07-20 15:23:15.087  INFO 4480 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@38cccef: startup date [Fri Jul 20 15:23:15 CDT 2018]; root of context hierarchy
2018-07-20 15:23:15.751  INFO 4480 --- [           main] j.z.d.l.component.TestComponent2         : log a info message -inside TestComponent2.setup()
2018-07-20 15:23:15.752  WARN 4480 --- [           main] j.z.d.l.component.TestComponent2         : log a warn message -inside TestComponent2.setup()
2018-07-20 15:23:15.752 ERROR 4480 --- [           main] j.z.d.l.component.TestComponent2         : log an error message -inside TestComponent2.setup()
2018-07-20 15:23:15.757  INFO 4480 --- [           main] j.z.d.l.component.TestComponent1         : log a info message -inside TestComponent1.setup()
2018-07-20 15:23:15.757  WARN 4480 --- [           main] j.z.d.l.component.TestComponent1         : log a warn message -inside TestComponent1.setup()
2018-07-20 15:23:15.758 ERROR 4480 --- [           main] j.z.d.l.component.TestComponent1         : log an error message -inside TestComponent1.setup()
2018-07-20 15:23:16.199  INFO 4480 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-07-20 15:23:16.218  INFO 4480 --- [           main] j.z.d.l.LogbackDemoApplication           : Started LogbackDemoApplication in 1.651 seconds (JVM running for 2.149)
2018-07-20 15:23:16.223  INFO 4480 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@38cccef: startup date [Fri Jul 20 15:23:15 CDT 2018]; root of context hierarchy
2018-07-20 15:23:16.225  INFO 4480 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2018-07-20 15:23:16.226  INFO 4480 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log a info message -inside TestComponent1.clean()
2018-07-20 15:23:16.226  WARN 4480 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log a warn message -inside TestComponent1.clean()
2018-07-20 15:23:16.226 ERROR 4480 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log an error message -inside TestComponent1.clean()
2018-07-20 15:23:16.226  INFO 4480 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log a info message -inside TestComponent2.clean()
2018-07-20 15:23:16.227  WARN 4480 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log a warn message -inside TestComponent2.clean()
2018-07-20 15:23:16.227 ERROR 4480 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log an error message -inside TestComponent2.clean()

C:\gitworkspace\logback-demo>

Note: The DEBUG and TRACE messages are not printed here.

4.5 Magic Revealed

In this step, I will explain how and why these log messages get displayed in the system console.

4.5.1 Where is the Logback Dependency?

Spring-boot-starter contains spring-boot-starter-loggingSpring-boot-starter-logging includes Logback’s three libraries:  logback-core, logback-classic, and logback-access. You can confirm that by viewing the effective pom.xml with the steps below:

  1. Open Eclipse.
  2. Open logback-demo maven project.
  3. Open pom.xml.
  4. Click on the “Effective POM” tab and you can find all three libraries there.

4.5.2 Where is Logback Class?

Simple logging facade for Java (SLF4J) is a facade for logging frameworks. Logback, Java Util Logging, and Log4J2 are commonly used implementations of SLF4J. By writing against SLF4J, our code remains decoupled from Logback, therefore providing us the flexibility to plug-in a different logging framework if required.

As you saw in both TestComponent1 and TestComponent2, the Logger interface is imported from org.slf4j.Logger. It is not from ch.qos.logback.classic.Logger; Spring Boot chooses Logback.

4.5.3 Where is Logback Configuration?

Logback’s configuration file can be placed in the classpath and named as logback.xml or logback-test.xml. Logback first tries to find configuration by searching for files with the name logback-test.xml, logback.groovy, or logback.xml, in that specific order. If it does not find these files, it will attempt to locate an implementation of the com.qos.logback.classic.spi.Configurator class. If no configuration is found, then it defaults to a ConsoleAppender, and associates it with the root logger. The root logger level defaults to the DEBUG level.

Spring boot provides a default configuration file – base.xml. I copied the content here as a quick reference.

Spring boot base.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

Spring boot defaults the root logger level to INFO. Click here for more details about the Spring default logging setting.

In this simple application, we did not set up any configurations, so Logback uses the default Spring boot configuration to output the INFO log message to the system console.

5. Logger Level

Logback has five levels, in order of precedence:

  • TRACE – the most detailed informational events.
  • DEBUG – fine-grained informational events that are most useful to debug an application.
  • INFO – informational messages that highlight the progress of the application.
  • WARN – potentially harmful situations.
  • ERROR – error events.

Applications use the logger’s level to filter the messages when placing them into an Appender.

5.1 TestComponent3

Logger's Level can be set either via configuration or Logger.setLevel(). Setting the level in the code overrides the setting in the configuration files. The root logger defaults to DEBUG. If a Logger isn’t explicitly assigned a level, it inherits the level of its closest ancestor.

TestComponent3.java

package jcg.zheng.demo.logbackdemo.component;

import javax.annotation.PostConstruct;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import ch.qos.logback.classic.Level;

@Component
public class TestComponent3 extends DemoLog{

	@PostConstruct
	public void setup() {
		ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(TestComponent3.class);
		logbackLogger.setLevel(Level.ERROR);
		DemoLog.logStatements(logbackLogger, "-inside TestComponent3.setup() ");
	}
}

Note: The SLF4J’s Logger does not support setLevel(), so we have to cast it to ch.qos.logback.classic.Logger in order to set the level via code.

5.2 Demo

Execute java -jar target\logback-demo-0.0.1-SNAPSHOT.jar to start the LogbackDemoApplication.

application output

C:\gitworkspace\logback-demo>java -jar target\logback-demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

2018-07-20 15:52:59.374  INFO 12116 --- [           main] j.z.d.l.LogbackDemoApplication           : Starting LogbackDemoApplication v0.0.1-SNAPSHOT on SL2LS431841 with PID 12116 (C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar started by Shu.Shan in C:\gitworkspace\logback-demo)
2018-07-20 15:52:59.379  INFO 12116 --- [           main] j.z.d.l.LogbackDemoApplication           : No active profile set, falling back to default profiles: default
2018-07-20 15:52:59.449  INFO 12116 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3ada9e37: startup date [Fri Jul 20 15:52:59 CDT 2018]; root of context hierarchy
2018-07-20 15:53:00.061  INFO 12116 --- [           main] j.z.d.l.component.TestComponent2         : log a info message -inside TestComponent2.setup()
2018-07-20 15:53:00.069  WARN 12116 --- [           main] j.z.d.l.component.TestComponent2         : log a warn message -inside TestComponent2.setup()
2018-07-20 15:53:00.069 ERROR 12116 --- [           main] j.z.d.l.component.TestComponent2         : log an error message -inside TestComponent2.setup()
2018-07-20 15:53:00.072 ERROR 12116 --- [           main] j.z.d.l.component.TestComponent3         : log an error message -inside TestComponent3.setup()
2018-07-20 15:53:00.076  INFO 12116 --- [           main] j.z.d.l.component.TestComponent1         : log a info message -inside TestComponent1.setup()
2018-07-20 15:53:00.077  WARN 12116 --- [           main] j.z.d.l.component.TestComponent1         : log a warn message -inside TestComponent1.setup()
2018-07-20 15:53:00.079 ERROR 12116 --- [           main] j.z.d.l.component.TestComponent1         : log an error message -inside TestComponent1.setup()
2018-07-20 15:53:00.608  INFO 12116 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-07-20 15:53:00.631  INFO 12116 --- [           main] j.z.d.l.LogbackDemoApplication           : Started LogbackDemoApplication in 1.764 seconds (JVM running for 2.319)
2018-07-20 15:53:00.636  INFO 12116 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3ada9e37: startup date [Fri Jul 20 15:52:59 CDT 2018]; root of context hierarchy
2018-07-20 15:53:00.639  INFO 12116 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2018-07-20 15:53:00.642  INFO 12116 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log a info message -inside TestComponent1.clean()
2018-07-20 15:53:00.650  WARN 12116 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log a warn message -inside TestComponent1.clean()
2018-07-20 15:53:00.652 ERROR 12116 --- [       Thread-2] j.z.d.l.component.TestComponent1         : log an error message -inside TestComponent1.clean()
2018-07-20 15:53:00.653  INFO 12116 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log a info message -inside TestComponent2.clean()
2018-07-20 15:53:00.655  WARN 12116 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log a warn message -inside TestComponent2.clean()
2018-07-20 15:53:00.657 ERROR 12116 --- [       Thread-2] j.z.d.l.component.TestComponent2         : log an error message -inside TestComponent2.clean()

C:\gitworkspace\logback-demo>

Note: TestComponent3 only prints out ERROR logs regardless of the default INFO setting.

6. Appender

Loggers pass LoggingEvents to AppendersLogback-core provides several useful appenders.

6.1 ConsoleAppender

We’ve seen ConsoleAppender already. ConsoleAppender appends messages to System.out or System.err.

6.2 FileAppender

FileAppender appends messages to a file. It supports a broad range of configuration parameters. FileAppender is configured with a file name via <file>. The <append> tag instructs the Appender to append messages to existing file rather than truncating it.

6.3 RollingFileAppender

RollingFileAppender appends log messages to the file and the file is “rolled” based on time, log file size, or a combination of both.

7. Layout

Layout is responsible for transforming an incoming LoggingEvents into a String. PatternLayout is included in Logback. It implements a large variety of conversion words and format modifiers for creating patterns. It recognizes conversion words with a %. Here are some commonly used conversion patterns:

  • %d{HH:mm:ss.SSS} – a timestamp with hours, minutes, seconds and milliseconds
  • %date{ISO8601} – a date with ISO 8601 format
  • [%thread] – the thread name generating the log message, surrounded by square brackets
  • %-5level – the level of the logging event, padded to 5 characters
  • %logger{36} – the class name the log message occurred in. The number inside the brackets represents the maximum length of the package plus the class name. If the output is longer than the specified length, it will take a substring of the first character of each individual package starting from the root package until the output is below the maximum length. The class name will never be reduced
  • %msg%n – the actual log messages followed by a new line

8. Configuration Examples

In this step, I will demonstrate the Logback configuration in four ways:

  • Spring boot application.properties
  • Spring boot logback-spring.xml
  • logback.xml
  • logback-test.xml

8.1 Application.properties

In this step, I will add the logging configuration in the appplication.properties to output the log message with different formats for both console and file appenders.

application.properties

logging.level.=INFO

logging.level.org.springframework=OFF
logging.level.jcg.zheng.demo=DEBUG
logging.file=demo-sb-default.log

# Logging pattern for the console
logging.pattern.console= %date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", CST} CST - %msg%n

# Logging pattern for file
logging.pattern.file= %date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} UTC [%thread] %-5level %logger{36} - %msg%n

Execute java -jar target\logback-demo-0.0.1-SNAPSHOT.jar to start the LogbackDemoApplication.

Application Console Output

C:\gitworkspace\logback-demo>java -jar target\logback-demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

2018-07-20T16:03:00,180-05:00 CST - Starting LogbackDemoApplication v0.0.1-SNAPSHOT on SL2LS431841 with PID 11904 (C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar started by Shu.Shan in C:\gitworkspace\logback-demo)
2018-07-20T16:03:00,184-05:00 CST - Running with Spring Boot v2.0.3.RELEASE, Spring v5.0.7.RELEASE
2018-07-20T16:03:00,185-05:00 CST - No active profile set, falling back to default profiles: default
2018-07-20T16:03:00,728-05:00 CST - log a debug message -inside TestComponent1.setup()
2018-07-20T16:03:00,729-05:00 CST - log a info message -inside TestComponent1.setup()
2018-07-20T16:03:00,729-05:00 CST - log a warn message -inside TestComponent1.setup()
2018-07-20T16:03:00,729-05:00 CST - log an error message -inside TestComponent1.setup()
2018-07-20T16:03:00,731-05:00 CST - log a debug message -inside TestComponent2.setup()
2018-07-20T16:03:00,732-05:00 CST - log a info message -inside TestComponent2.setup()
2018-07-20T16:03:00,732-05:00 CST - log a warn message -inside TestComponent2.setup()
2018-07-20T16:03:00,732-05:00 CST - log an error message -inside TestComponent2.setup()
2018-07-20T16:03:00,734-05:00 CST - log an error message -inside TestComponent3.setup()
2018-07-20T16:03:01,234-05:00 CST - Started LogbackDemoApplication in 1.57 seconds (JVM running for 2.102)
2018-07-20T16:03:01,240-05:00 CST - log a debug message -inside TestComponent2.clean()
2018-07-20T16:03:01,241-05:00 CST - log a info message -inside TestComponent2.clean()
2018-07-20T16:03:01,241-05:00 CST - log a warn message -inside TestComponent2.clean()
2018-07-20T16:03:01,242-05:00 CST - log an error message -inside TestComponent2.clean()
2018-07-20T16:03:01,242-05:00 CST - log a debug message -inside TestComponent1.clean()
2018-07-20T16:03:01,243-05:00 CST - log a info message -inside TestComponent1.clean()
2018-07-20T16:03:01,243-05:00 CST - log a warn message -inside TestComponent1.clean()
2018-07-20T16:03:01,245-05:00 CST - log an error message -inside TestComponent1.clean()

C:\gitworkspace\logback-demo>

Here are the demo-db-default.log file contents.

Application File Output

2018-07-20T21:03:00,180Z UTC [main] INFO  j.z.d.l.LogbackDemoApplication - Starting LogbackDemoApplication v0.0.1-SNAPSHOT on SL2LS431841 with PID 11904 (C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar started by Shu.Shan in C:\gitworkspace\logback-demo)
2018-07-20T21:03:00,184Z UTC [main] DEBUG j.z.d.l.LogbackDemoApplication - Running with Spring Boot v2.0.3.RELEASE, Spring v5.0.7.RELEASE
2018-07-20T21:03:00,185Z UTC [main] INFO  j.z.d.l.LogbackDemoApplication - No active profile set, falling back to default profiles: default
2018-07-20T21:03:00,728Z UTC [main] DEBUG j.z.d.l.component.TestComponent1 - log a debug message -inside TestComponent1.setup() 
2018-07-20T21:03:00,729Z UTC [main] INFO  j.z.d.l.component.TestComponent1 - log a info message -inside TestComponent1.setup() 
2018-07-20T21:03:00,729Z UTC [main] WARN  j.z.d.l.component.TestComponent1 - log a warn message -inside TestComponent1.setup() 
2018-07-20T21:03:00,729Z UTC [main] ERROR j.z.d.l.component.TestComponent1 - log an error message -inside TestComponent1.setup() 
2018-07-20T21:03:00,731Z UTC [main] DEBUG j.z.d.l.component.TestComponent2 - log a debug message -inside TestComponent2.setup() 
2018-07-20T21:03:00,732Z UTC [main] INFO  j.z.d.l.component.TestComponent2 - log a info message -inside TestComponent2.setup() 
2018-07-20T21:03:00,732Z UTC [main] WARN  j.z.d.l.component.TestComponent2 - log a warn message -inside TestComponent2.setup() 
2018-07-20T21:03:00,732Z UTC [main] ERROR j.z.d.l.component.TestComponent2 - log an error message -inside TestComponent2.setup() 
2018-07-20T21:03:00,734Z UTC [main] ERROR j.z.d.l.component.TestComponent3 - log an error message -inside TestComponent3.setup() 
2018-07-20T21:03:01,234Z UTC [main] INFO  j.z.d.l.LogbackDemoApplication - Started LogbackDemoApplication in 1.57 seconds (JVM running for 2.102)
2018-07-20T21:03:01,240Z UTC [Thread-2] DEBUG j.z.d.l.component.TestComponent2 - log a debug message -inside TestComponent2.clean() 
2018-07-20T21:03:01,241Z UTC [Thread-2] INFO  j.z.d.l.component.TestComponent2 - log a info message -inside TestComponent2.clean() 
2018-07-20T21:03:01,241Z UTC [Thread-2] WARN  j.z.d.l.component.TestComponent2 - log a warn message -inside TestComponent2.clean() 
2018-07-20T21:03:01,242Z UTC [Thread-2] ERROR j.z.d.l.component.TestComponent2 - log an error message -inside TestComponent2.clean() 
2018-07-20T21:03:01,242Z UTC [Thread-2] DEBUG j.z.d.l.component.TestComponent1 - log a debug message -inside TestComponent1.clean() 
2018-07-20T21:03:01,243Z UTC [Thread-2] INFO  j.z.d.l.component.TestComponent1 - log a info message -inside TestComponent1.clean() 
2018-07-20T21:03:01,243Z UTC [Thread-2] WARN  j.z.d.l.component.TestComponent1 - log a warn message -inside TestComponent1.clean() 
2018-07-20T21:03:01,245Z UTC [Thread-2] ERROR j.z.d.l.component.TestComponent1 - log an error message -inside TestComponent1.clean() 

Note: The console log messages display as CST timezone and the file log messages display as UTC timezone.

8.2 Logback-spring.xml

In this step, I will add a logback-spring.xml file to log the messages into a logs_sb_logback directory.

logback-spring.xml

<configuration scan="true">
   <property name="FOLDER_HOME" value="logs_sb_logback" />
	<appender name="FILE_INFO"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${FOLDER_HOME}/app_info.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -
				%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${FOLDER_HOME}/app_info.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<appender name="FILE_ERROR"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${FOLDER_HOME}/app_error.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss};%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${FOLDER_HOME}/app_error.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent1" level="info"
		additivity="false">
		<appender-ref ref="FILE_INFO" />
	</logger>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent2" level="error"
		additivity="false">
		<appender-ref ref="FILE_ERROR" />
	</logger>

	<root level="info">
		<appender-ref ref="FILE_INFO" />
		<appender-ref ref="FILE_ERROR" />
	</root>
</configuration>

Execute java -jar target\logback-demo-0.0.1-SNAPSHOT.jar to start the LogbackDemoApplication. Then you will see two log files created under the logs_sb_logback directory and no log messages in the system console.

8.3 Logback.xml

In this step, I will add a logback.xml file to log the messages into a logs-lb directory.

logback.xml

<configuration scan="true">
    <property name="LOG_DIR" value="logs_lb" />
	<appender name="FILE_INFO"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/app_info.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -
				%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${LOG_DIR}/app_info.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<appender name="FILE_ERROR"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/app_error.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss};%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${LOG_DIR}/app_error.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent1" level="info"
		additivity="false">
		<appender-ref ref="FILE_INFO" />
	</logger>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent2" level="error"
		additivity="false">
		<appender-ref ref="FILE_ERROR" />
	</logger>

	<root level="info">
		<appender-ref ref="FILE_INFO" />
		<appender-ref ref="FILE_ERROR" />
	</root>
</configuration>

Execute java -jar target\logback-demo-0.0.1-SNAPSHOT.jar to start the LogbackDemoApplication. You will see two log files created at the logs_lb directory.

8.4 Logback-test.xml

In this step, I will create a logback-test.xml to output the log messages at logs-test folder. Setting additivity to false disables the default behavior; Setting debug to true enable the Logback debugging messages.

Logback-test.xml

<configuration debug="true" scan="true" scanPeriod="150 seconds">
	<property name="LOG_DIR" value="logs-test" />
	<appender name="FILE_INFO"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/app_info.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} -
				%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${LOG_DIR}/app_info.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<appender name="FILE_ERROR"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/app_error.log</file>
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>
				%d{yyyy-MM-dd HH:mm:ss};%msg%n
			</Pattern>
		</encoder>

		<rollingPolicy
			class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- rollover daily -->
			<fileNamePattern>${LOG_DIR}/app_error.%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy
				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent1" level="info"
		additivity="false">
		<appender-ref ref="FILE_INFO" />
	</logger>

	<logger name="jcg.zheng.demo.logbackdemo.component.TestComponent2" level="error"
		additivity="false">
		<appender-ref ref="FILE_ERROR" />
	</logger>

	<root level="info">
		<appender-ref ref="FILE_INFO" />
		<appender-ref ref="FILE_ERROR" />
	</root>
</configuration>

Execute mvn clean install.

Logback-test.xml

C:\gitworkspace\logback-demo>mvn clean install
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building logback-demo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ logback-demo ---
[INFO] Deleting C:\gitworkspace\logback-demo\target
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ logback-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ logback-demo---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to C:\gitworkspace\logback-demo\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @logback-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ logback-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\gitworkspace\logback-demo\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ logback-demo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running jcg.zheng.demo.logbackdemo.LogbackDemoApplicationTests16:28:34,407 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/C:/gitworkspace/logback-demo/target/test-classes/logback-test.xml]
16:28:34,517 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Will scan for changes in [file:/C:/gitworkspace/logback-demo/target/test-classes/logback-test.xml]
16:28:34,517 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeTask scanning period to 2 minutes
16:28:34,521 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

16:28:34,527 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Namingappender as [FILE_INFO]
16:28:34,582 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@603650290 - Nocompression will be used
16:28:34,584 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@603650290 - Will use the pattern logs-test/app_info.%d{yyyy-MM-dd}.%i.log for the active file
16:28:34,588 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@396f6598 - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs-test/app_info.%d{yyyy-MM-dd}.%i.log'.
16:28:34,588 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@396f6598 - Roll-over at midnight.
16:28:34,595 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@396f6598 - Setting initial period to Fri Jul 20 16:27:48 CDT 2018
16:28:34,596 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@396f6598 - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
16:28:34,596 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@396f6598 - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
16:28:34,601 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_INFO] - Active log file name: logs-test/app_info.log
16:28:34,601 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_INFO] - File property is set to [logs-test/app_info.log]
16:28:34,603 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

16:28:34,604 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Namingappender as [FILE_ERROR]
16:28:34,606 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@674483268 - Nocompression will be used
16:28:34,607 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@674483268 - Will use the pattern logs-test/app_error.%d{yyyy-MM-dd}.%i.log for the active file
16:28:34,607 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@33f88ab - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs-test/app_error.%d{yyyy-MM-dd}.%i.log'.
16:28:34,607 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@33f88ab - Roll-over at midnight.
16:28:34,609 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@33f88ab - Setting initial period to Fri Jul 20 16:27:48 CDT 2018
16:28:34,609 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@33f88ab - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
16:28:34,609 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@33f88ab - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
16:28:34,610 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_ERROR] - Active log file name: logs-test/app_error.log
16:28:34,611 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_ERROR] - File property is set to [logs-test/app_error.log]
16:28:34,613 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [jcg.zheng.demo.logbackdemo.component.TestComponent1] to INFO
16:28:34,613 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [jcg.zheng.demo.logbackdemo.component.TestComponent1] tofalse
16:28:34,613 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_INFO] to Logger[jcg.zheng.demo.logbackdemo.component.TestComponent1]
16:28:34,614 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [jcg.zheng.demo.logbackdemo.component.TestComponent2] to ERROR

16:28:34,615 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [jcg.zheng.demo.logbackdemo.component.TestComponent2] tofalse
16:28:34,615 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_ERROR] to Logger[jcg.zheng.demo.logbackdemo.component.TestComponent2]
16:28:34,615 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
16:28:34,615 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_INFO] to Logger[ROOT]
16:28:34,615 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_ERROR] to Logger[ROOT]
16:28:34,616 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
16:28:34,617 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@e320068 -Registering current configuration as safe fallback point
16:28:35,309 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Will scan for changes in [file:/C:/gitworkspace/logback-demo/target/test-classes/logback-test.xml]
16:28:35,309 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeTask scanning period to 2 minutes
16:28:35,310 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

16:28:35,310 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Namingappender as [FILE_INFO]
16:28:35,314 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1261031890 - No compression will be used
16:28:35,314 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1261031890 - Will use the pattern logs-test/app_info.%d{yyyy-MM-dd}.%i.log for the active file
16:28:35,315 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7f485fda - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs-test/app_info.%d{yyyy-MM-dd}.%i.log'.
16:28:35,315 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7f485fda - Roll-over at midnight.
16:28:35,317 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7f485fda - Setting initial period to Fri Jul 20 16:28:35 CDT 2018
16:28:35,317 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7f485fda - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
16:28:35,317 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7f485fda - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
16:28:35,318 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_INFO] - Active log file name: logs-test/app_info.log
16:28:35,318 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_INFO] - File property is set to [logs-test/app_info.log]
16:28:35,319 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]

16:28:35,320 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Namingappender as [FILE_ERROR]
16:28:35,322 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@673586830 - Nocompression will be used
16:28:35,322 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@673586830 - Will use the pattern logs-test/app_error.%d{yyyy-MM-dd}.%i.log for the active file
16:28:35,323 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@d737b89 - The date pattern is 'yyyy-MM-dd' from file name pattern 'logs-test/app_error.%d{yyyy-MM-dd}.%i.log'.
16:28:35,323 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@d737b89 - Roll-over at midnight.
16:28:35,324 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@d737b89 - Setting initial period to Fri Jul 20 16:28:35 CDT 2018
16:28:35,324 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@d737b89 - SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead
16:28:35,325 |-WARN in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@d737b89 - For more information see http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
16:28:35,326 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_ERROR] - Active log file name: logs-test/app_error.log
16:28:35,326 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE_ERROR] - File property is set to [logs-test/app_error.log]
16:28:35,327 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [jcg.zheng.demo.logbackdemo.component.TestComponent1] to INFO
16:28:35,328 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating INFO level on Logger[jcg.zheng.demo.logbackdemo.component.TestComponent1] onto the JUL framework
16:28:35,329 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [jcg.zheng.demo.logbackdemo.component.TestComponent1] tofalse
16:28:35,329 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_INFO] to Logger[jcg.zheng.demo.logbackdemo.component.TestComponent1]
16:28:35,329 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [jcg.zheng.demo.logbackdemo.component.TestComponent2] to ERROR

16:28:35,329 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating ERROR level on Logger[jcg.zheng.demo.logbackdemo.component.TestComponent2] onto the JUL framework
16:28:35,330 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [jcg.zheng.demo.logbackdemo.component.TestComponent2] tofalse
16:28:35,330 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_ERROR] to Logger[jcg.zheng.demo.logbackdemo.component.TestComponent2]
16:28:35,330 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
16:28:35,330 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating INFO level on Logger[ROOT] onto the JUL framework
16:28:35,330 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_INFO] to Logger[ROOT]
16:28:35,331 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE_ERROR] to Logger[ROOT]
16:28:35,331 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
16:28:35,331 |-INFO in org.springframework.boot.logging.logback.SpringBootJoranConfigurator@72cc7e6f - Registering current configuration as safe fallback point
16:28:35,387 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating OFF level on Logger[org.springframework] onto the JUL framework
16:28:35,388 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating DEBUG level on Logger[jcg.zheng.demo] onto the JUL framework

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

16:28:36,377 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@8519cb4- Propagating ERROR level on Logger[jcg.zheng.demo.logbackdemo.component.TestCom
ponent3] onto the JUL framework
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.728 s - in jcg.zheng.demo.logbackdemo.LogbackDemoApplicationTests
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ logback-demo ---
[INFO] Building jar: C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.3.RELEASE:repackage (default) @ logback-demo ---
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ logback-demo ---
[INFO] Installing C:\gitworkspace\logback-demo\target\logback-demo-0.0.1-SNAPSHOT.jar to C:\repo\jcg\zheng\demo\logback-demo\0.0.1-SNAPSHOT\logback-demo-0.0.1-SNAPSHOT.jar
[INFO] Installing C:\gitworkspace\logback-demo\pom.xml to C:\repo\jcg\zheng\demo\logback-demo\0.0.1-SNAPSHOT\logback-demo-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.836s
[INFO] Finished at: Fri Jul 20 16:28:39 CDT 2018
[INFO] Final Memory: 26M/368M
[INFO] ------------------------------------------------------------------------
C:\gitworkspace\logback-demo>

Here are the log files in this simple application after ran for two days.

Logback Tutorial - Log Files
Figure 1 Log Files

9. Summary

In this article, we covered the fundamental functions of using Logback in a Spring boot Java application. We looked at the Logback’s architecture components: loggers, appenders, and layouts. We also demonstrated four configuration examples to create, format, and filter log messages.

10. Download the Source Code

This example consists of a Spring boot application to demonstrate the Logback features.

Download
You can download the full source code of this Logback Tutorial here: Logback Tutorial for Beginners

Mary Zheng

Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button