Skip to content

Commit

Permalink
General clean up of implementation. Added more tests and README.
Browse files Browse the repository at this point in the history
  • Loading branch information
jamezp committed Nov 12, 2018
1 parent 76a1ab6 commit cb58d1a
Show file tree
Hide file tree
Showing 18 changed files with 935 additions and 311 deletions.
26 changes: 26 additions & 0 deletions README.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
= A log4j2 implementation for JBoss Log Manager

An implementation of the log4j-api for the jboss-logmanager.

== Usage

[source,xml]
----
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${version.org.apache.logging.log4j}</version>
</dependency>
<dependency>
<groupId>org.jboss.logmanager</groupId>
<artifactId>log4j2-jboss-logmanager</artifactId>
<version>${version.org.jboss.logmanager.log4j2-jboss-logmanager}</version>
</dependency>
----


== Building

----
mvn clean install
----
19 changes: 4 additions & 15 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<parent>
<groupId>org.jboss</groupId>
<artifactId>jboss-parent</artifactId>
<version>21</version>
<version>29</version>
</parent>

<groupId>org.jboss.logmanager</groupId>
Expand All @@ -35,21 +35,16 @@

<licenses>
<license>
<name>Apache License Version 2.0</name>
<name>Apache License 2.0</name>
<url>http://repository.jboss.org/licenses/apache-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>

<properties>
<version.junit>4.12</version.junit>
<!-- TODO (jrp) maybe we should target an older version, 2.6.x, of log4j2 -->
<version.org.apache.logging.log4j>2.8.2</version.org.apache.logging.log4j>
<version.org.jboss.logmanager.jboss-logmanager>2.0.6.Final</version.org.jboss.logmanager.jboss-logmanager>

<!-- TODO (jrp) log4j2 is 1.7, but should we go 1.8 -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<version.org.apache.logging.log4j>2.11.1</version.org.apache.logging.log4j>
<version.org.jboss.logmanager.jboss-logmanager>2.1.5.Final</version.org.jboss.logmanager.jboss-logmanager>
</properties>

<dependencies>
Expand All @@ -71,12 +66,6 @@
<version>${version.junit}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${version.org.apache.logging.log4j}</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
32 changes: 31 additions & 1 deletion src/main/java/org/jboss/logmanager/log4j/JBossLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,16 @@

package org.jboss.logmanager.log4j;

import java.util.Collections;
import java.util.Iterator;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.jboss.logmanager.ExtLogRecord;

/**
* An implementation of a log4j2 {@linkplain org.apache.logging.log4j.Logger logger} that delegates to a JBoss Log
Expand Down Expand Up @@ -133,12 +138,37 @@ public boolean isEnabled(final Level level, final Marker marker, final String me
public void logMessage(final String fqcn, final Level level, final Marker marker, final Message message, final Throwable t) {
// Ignore null messages
if (message != null) {
logger.log(fqcn, levelTranslator.translateLevel(level), message.getFormattedMessage(), t);
final ExtLogRecord record = new ExtLogRecord(levelTranslator.translateLevel(level),
message.getFormattedMessage(), ExtLogRecord.FormatStyle.NO_FORMAT, fqcn);
if (ThreadContext.isEmpty()) {
record.setMdc(Collections.emptyMap());
} else {
record.setMdc(ThreadContext.getContext());
}
record.setNdc(getNdc());
record.setThrown(t);
logger.log(record);
}
}

@Override
public Level getLevel() {
return levelTranslator.translateLevel(logger.getLevel());
}

private String getNdc() {
final ThreadContext.ContextStack contextStack = ThreadContext.getImmutableStack();
if (contextStack.isEmpty()) {
return "";
}
final StringBuilder result = new StringBuilder();
final Iterator<String> iter = contextStack.iterator();
while (iter.hasNext()) {
result.append(iter.next());
if (iter.hasNext()) {
result.append('.');
}
}
return result.toString();
}
}
130 changes: 101 additions & 29 deletions src/main/java/org/jboss/logmanager/log4j/JBossLoggerContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@

package org.jboss.logmanager.log4j;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;

import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.spi.ExtendedLogger;
import org.apache.logging.log4j.spi.LoggerContext;
import org.jboss.logmanager.LogContext;
Expand All @@ -31,8 +35,9 @@
*
* @author <a href="mailto:[email protected]">James R. Perkins</a>
*/
@SuppressWarnings({"Convert2Lambda", "SynchronizationOnLocalVariableOrMethodParameter"})
class JBossLoggerContext implements LoggerContext {
private static final Logger.AttachmentKey<ExtendedLogger> LOGGER_KEY = new Logger.AttachmentKey<>();
private static final Logger.AttachmentKey<Map<Key, ExtendedLogger>> LOGGER_KEY = new Logger.AttachmentKey<>();
private final LogContext logContext;
private final Object externalContext;

Expand All @@ -54,32 +59,12 @@ public Object getExternalContext() {

@Override
public ExtendedLogger getLogger(final String name) {
final LogContext context = logContext;
ExtendedLogger result = context.getAttachment(name, LOGGER_KEY);
if (result == null) {
final Logger lmLogger = context.getLogger(name);
result = new JBossLogger(lmLogger);
final ExtendedLogger appearing = lmLogger.attachIfAbsent(LOGGER_KEY, result);
if (appearing != null) {
result = appearing;
}
}
return result;
return getOrCreateLogger(new Key(name, null));
}

@Override
public ExtendedLogger getLogger(final String name, final MessageFactory messageFactory) {
final LogContext context = logContext;
ExtendedLogger result = context.getAttachment(name, LOGGER_KEY);
if (result == null) {
final Logger lmLogger = context.getLogger(name);
result = new JBossLogger(lmLogger, messageFactory);
final ExtendedLogger appearing = lmLogger.attachIfAbsent(LOGGER_KEY, result);
if (appearing != null) {
result = appearing;
}
}
return result;
return getOrCreateLogger(new Key(name, messageFactory));
}

@Override
Expand All @@ -89,14 +74,101 @@ public boolean hasLogger(final String name) {

@Override
public boolean hasLogger(final String name, final MessageFactory messageFactory) {
return messageFactory == null ?
hasLogger(name, AbstractLogger.DEFAULT_MESSAGE_FACTORY_CLASS) :
hasLogger(name, messageFactory.getClass());
return hasLogger(name, messageFactory == null ? null : messageFactory.getClass());
}

@Override
public boolean hasLogger(final String name, final Class<? extends MessageFactory> messageFactoryClass) {
final ExtendedLogger logger = logContext.getAttachment(name, LOGGER_KEY);
return logger != null && logger.getMessageFactory().getClass() == messageFactoryClass;
final Map<Key, ExtendedLogger> loggers = logContext.getAttachment(name, LOGGER_KEY);
if (loggers == null) {
return false;
}
synchronized (loggers) {
for (Key key : loggers.keySet()) {
if (messageFactoryClass == null && key.messageFactory == null) {
return true;
} else if (key.messageFactory != null && key.messageFactory.getClass() == messageFactoryClass) {
return true;
}
}
}
return false;
}

private ExtendedLogger getOrCreateLogger(final Key key) {
final Map<Key, ExtendedLogger> loggers = getLoggers(logContext, key.name);
synchronized (loggers) {
return loggers.computeIfAbsent(key, new Function<Key, ExtendedLogger>() {
@Override
public ExtendedLogger apply(final Key key) {
if (key.messageFactory == null) {
return new JBossLogger(logContext.getLogger(key.name));
}
return new JBossLogger(logContext.getLogger(key.name), key.messageFactory);
}
});
}
}

@Override
public int hashCode() {
return Objects.hash(logContext, externalContext);
}

@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof JBossLoggerContext)) {
return false;
}
final JBossLoggerContext other = (JBossLoggerContext) obj;
return Objects.equals(logContext, other.logContext) && Objects.equals(externalContext, other.externalContext);
}

private static Map<Key, ExtendedLogger> getLoggers(final LogContext context, final String name) {
Map<Key, ExtendedLogger> result = context.getAttachment(name, LOGGER_KEY);
if (result == null) {
final Logger lmLogger = context.getLogger(name);
result = new HashMap<>();
final Map<Key, ExtendedLogger> appearing = lmLogger.attachIfAbsent(LOGGER_KEY, result);
if (appearing != null) {
result = appearing;
}
}
return result;
}

private static class Key {
final String name;
final MessageFactory messageFactory;

private Key(final String name, final MessageFactory messageFactory) {
this.name = name;
this.messageFactory = messageFactory;
}

@Override
public int hashCode() {
return Objects.hash(name, messageFactory);
}

@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Key)) {
return false;
}
final Key other = (Key) obj;
return Objects.equals(name, other.name) && Objects.equals(messageFactory, other.messageFactory);
}

@Override
public String toString() {
return "Key(name=" + name + ", messageFactory=" + messageFactory + ")";
}
}
}
Loading

0 comments on commit cb58d1a

Please sign in to comment.