Log4J MDC, Log4J2 MDC samples added.

This commit is contained in:
danidemi 2016-10-31 16:43:48 +01:00
parent c0ed2e50cb
commit 62de84bb52
12 changed files with 246 additions and 0 deletions

13
log-mdc-ndc/README.md Normal file
View File

@ -0,0 +1,13 @@
### Relevant Articles:
- TBD
### References
_Log4j MDC_
* <https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html>
* <http://veerasundar.com/blog/2009/10/log4j-mdc-mapped-diagnostic-context-what-and-why/>
_Log4j2_
* <https://logging.apache.org/log4j/2.x/manual/thread-context.html>

39
log-mdc-ndc/pom.xml Normal file
View File

@ -0,0 +1,39 @@
<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>com.baeldug</groupId>
<artifactId>logmdcndc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>logmdcndc</name>
<description>tutorial on logging with MDC and NDC</description>
<dependencies>
<!--log4j dependencies -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--log4j2 dependencies-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<!--disruptor for log4j2 async logging-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,7 @@
package com.baeldung.mdc;
public interface BusinessService {
void businessMethod(String transactionId);
}

View File

@ -0,0 +1,29 @@
package com.baeldung.mdc;
import java.util.Date;
public class TransactionContext {
private String transactionId;
private String owner;
private Date createdAt;
public TransactionContext(String transactionId, String owner) {
this.transactionId = transactionId;
this.owner = owner;
this.createdAt = new Date();
}
public String getOwner() {
return owner;
}
public String getTransactionId() {
return transactionId;
}
public Date getCreatedAt() {
return createdAt;
}
}

View File

@ -0,0 +1,16 @@
package com.baeldung.mdc.log4j;
import org.apache.log4j.Logger;
import com.baeldung.mdc.BusinessService;
public class Log4jBusinessService implements BusinessService {
private final static Logger logger = Logger.getLogger(Log4jBusinessService.class);
@Override
public void businessMethod(String transactionId) {
logger.info("Executing transaction #" + transactionId );
}
}

View File

@ -0,0 +1,17 @@
package com.baeldung.mdc.log4j;
public class Log4jDemo {
public static void main(String[] args) throws InterruptedException {
Log4jExecutor greeter = new Log4jExecutor();
Thread thread1 = new Thread(greeter);
Thread thread2 = new Thread(greeter);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}

View File

@ -0,0 +1,23 @@
package com.baeldung.mdc.log4j;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import com.baeldung.mdc.TransactionContext;
public class Log4jExecutor implements Runnable {
public void run() {
String transactionId = "" + Math.random();
String owner = "owner" + Math.random();
TransactionContext ctx = new TransactionContext(transactionId, owner);
MDC.put("transaction.id", transactionId);
MDC.put("transaction.owner", owner);
MDC.put("transaction.createdAt", ctx.getCreatedAt());
new Log4jBusinessService().businessMethod(ctx.getTransactionId());
}
}

View File

@ -0,0 +1,19 @@
package com.baeldung.mdc.log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.baeldung.mdc.BusinessService;
public class Log4j2BusinessService implements BusinessService {
private static final Logger logger = LogManager.getLogger(); //Log4j2BusinessService.class);
@Override
public void businessMethod(String transactionId) {
logger.info("Executing transaction #{}", transactionId );
}
}

View File

@ -0,0 +1,17 @@
package com.baeldung.mdc.log4j2;
public class Log4j2Demo {
public static void main(String[] args) throws InterruptedException {
Log4j2Executor greeter = new Log4j2Executor();
Thread thread1 = new Thread(greeter);
Thread thread2 = new Thread(greeter);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}

View File

@ -0,0 +1,22 @@
package com.baeldung.mdc.log4j2;
import org.apache.logging.log4j.ThreadContext;
import com.baeldung.mdc.TransactionContext;
public class Log4j2Executor implements Runnable {
public void run() {
String transactionId = "" + Math.random();
String owner = "owner" + Math.random();
TransactionContext ctx = new TransactionContext(transactionId, owner);
ThreadContext.put("transaction.id", transactionId);
ThreadContext.put("transaction.owner", owner);
ThreadContext.put("transaction.createdAt", ctx.getCreatedAt().toString());
new Log4j2BusinessService().businessMethod(ctx.getTransactionId());
}
}

View File

@ -0,0 +1,12 @@
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=/tmp/$X{transaction.owner}
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#note the %X{userName} - this is how you fetch data from Mapped Diagnostic Context (MDC)
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n
log4j.appender.file.layout.ConversionPattern=%-4r [%t] %5p %c %x - %m - owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n
log4j.rootLogger = ALL, consoleAppender, file

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
# Console appender
<Console name="stdout" target="SYSTEM_OUT">
# Pattern of log message for console appender
<PatternLayout pattern="Log4j2 - %d{yyyy-MM-dd HH:mm:ss} %p %m owner=%X{transaction.owner} creation=%X{transaction.createdAt}%n"/>
</Console>
# File appender
<!--
<File name="fout" fileName="log4j/target/baeldung-log4j2.log" immediateFlush="false" append="false">
# Pattern of log message for file appender
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %p %m%n"/>
</File>
-->
</Appenders>
<Loggers>
# Override log level for specified package
<Logger name="com.baeldung.log4j2" level="TRACE"/>
<AsyncRoot level="DEBUG">
<AppenderRef ref="stdout"/>
<!--
<AppenderRef ref="fout"/>
-->
</AsyncRoot>
</Loggers>
</Configuration>