Following example shows how to use SLF4j in spring core before Spring 5.
Spring 5 provided its own spring-jcl bridge which makes it easier to use other famous logging framework without a lot of efforts.
Before Spring 5 we had to exclude common logging dependency.
pom.xml<project .....> <modelVersion>4.0.0</modelVersion> <groupId>com.logicbig.example</groupId> <artifactId>spring-slf4j-logging-before-version-5</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.6</version> </dependency>
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.25.2</version> </dependency>
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.25.2</version> </dependency>
</dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.14.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
Note that, if we don't exclude commons-logging and don't add jcl-over-slf4j dependency then we can still use SLF4J API in our code, but Spring internal logging will still be going through JCL and that might end up in two different formatted output (JCL might switch to its default JUL logger).
A Bean using SLF4J API
package com.logicbig.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyBean {
private static Logger log = LoggerFactory.getLogger(MyBean.class);
public void doSomething() {
log.info("doing something");
}
}
log4j.properties
src/main/resources/log4j2.propertiesstatus = error
name = PropertiesConfig
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = info
appenders = console
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yy-MM-dd HH:mm:ss:SSS} %-5p %c{1}:%L - %m%n
rootLogger.level = info
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
Main class
package com.logicbig.example;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExampleMain {
@Bean
public MyBean myBean() {
return new MyBean();
}
public static void main(String[] args) {
ConfigurableApplicationContext context =
new AnnotationConfigApplicationContext(ExampleMain.class);
MyBean bean = context.getBean(MyBean.class);
bean.doSomething();
}
}
Output25-11-11 14:06:25:498 INFO MyBean:10 - doing something
Example ProjectDependencies and Technologies Used: - spring-core 4.0.0.RELEASE (Spring Core)
- spring-context 4.0.0.RELEASE (Spring Context)
- jcl-over-slf4j 1.7.6 (JCL 1.1.1 implemented over SLF4J)
- log4j-core 2.25.2 (A versatile, industrial-grade, and reference implementation of the Log4j API.
It bundles a rich set of components to assist various use cases:
Appenders targeting files, network sockets, databases, SMTP servers;
Layouts that can render CSV, HTML, JSON, Syslog, etc. formatted outputs;
Filters that can be configured using log event rates, regular expressions, scripts, time, etc.
It contains several extension points to introduce custom components, if needed. [Description from log4j-core-2.25.2.pom])
- log4j-slf4j-impl 2.25.2 (SLF4J 1 binding (provider) for the Log4j API.
It forwards SLF4J 1 calls to the Log4j API.
(Refer to the `log4j-to-slf4j` artifact for forwarding the Log4j API to SLF4J.))
- JDK 1.8
- Maven 3.9.11
|