Skip to content

Commit 30e0651

Browse files
authored
Merge pull request #44 from dmlloyd/stack
Improve performance of publication
2 parents 1218126 + 19d25db commit 30e0651

File tree

4 files changed

+47
-42
lines changed

4 files changed

+47
-42
lines changed

src/main/java/org/apache/log4j/JBossAppenderHandler.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.apache.log4j.spi.Filter;
56
import org.apache.log4j.spi.LoggingEvent;
67
import org.jboss.logmanager.ExtHandler;
78
import org.jboss.logmanager.ExtLogRecord;
@@ -27,12 +28,28 @@ protected JBossAppenderHandler(final Logger logger) {
2728

2829
@Override
2930
protected void doPublish(final ExtLogRecord record) {
30-
final LoggingEvent event = new LoggingEvent(record, JBossLogManagerFacade.getLogger(logger));
31+
final LoggingEvent event = new LoggingEvent(record, logger.getLogContext());
3132
final List<Appender> appenders = Appenders.getAppenderList(logger);
32-
for (Appender appender : appenders) {
33-
if (new JBossFilterWrapper(appender.getFilter(), true).isLoggable(record)) {
34-
appender.doAppend(event);
33+
outer: for (Appender appender : appenders) {
34+
Filter filter = appender.getFilter();
35+
inner: while (filter != null) {
36+
switch (appender.getFilter().decide(event)) {
37+
case Filter.DENY: {
38+
// skip this appender
39+
continue outer;
40+
}
41+
case Filter.ACCEPT: {
42+
// accept this message
43+
break inner;
44+
}
45+
default: {
46+
// defer decision
47+
break;
48+
}
49+
}
50+
filter = filter.getNext();
3551
}
52+
appender.doAppend(event);
3653
}
3754
}
3855

src/main/java/org/apache/log4j/JBossFilterWrapper.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/main/java/org/apache/log4j/JBossLogManagerFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ static Logger exists(String name) {
131131
*
132132
* @return the logger or {@code null} if no logger is attached.
133133
*/
134-
static Logger getLogger(org.jboss.logmanager.Logger lmLogger) {
134+
public static Logger getLogger(org.jboss.logmanager.Logger lmLogger) {
135135
return getAttachment(lmLogger, LOGGER_KEY);
136136
}
137137

src/main/java/org/apache/log4j/spi/LoggingEvent.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
import java.util.Hashtable;
1313
import java.util.Map;
1414
import java.util.Set;
15+
16+
import org.apache.log4j.JBossLogManagerFacade;
1517
import org.jboss.logmanager.ExtLogRecord;
18+
import org.jboss.logmanager.LogContext;
1619
import org.jboss.modules.Module;
1720

1821
import org.apache.log4j.Category;
@@ -74,6 +77,7 @@ public class LoggingEvent implements Serializable {
7477
public final transient String fqnOfCategoryClass;
7578
public transient Priority level;
7679

80+
private transient final org.jboss.logmanager.LogContext logContext;
7781
private transient Category logger;
7882

7983
//// Private fields
@@ -104,6 +108,7 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger, Priority level,
104108
logRecord.setThrown(throwable);
105109
}
106110
logRecord.setMillis(timeStamp = System.currentTimeMillis());
111+
logContext = null;
107112
}
108113

109114
public LoggingEvent(String fqnOfCategoryClass, Category logger, long timeStamp, Priority level, Object message, Throwable throwable) {
@@ -120,6 +125,7 @@ public LoggingEvent(String fqnOfCategoryClass, Category logger, long timeStamp,
120125
logRecord.setThrown(throwable);
121126
}
122127
logRecord.setMillis(this.timeStamp = timeStamp);
128+
logContext = null;
123129
}
124130

125131
public LoggingEvent(final String fqnOfCategoryClass, final Category logger, final long timeStamp, final Level level, final Object message, final String threadName, final ThrowableInformation throwable, final String ndc, final LocationInfo info, final java.util.Map properties) {
@@ -157,17 +163,29 @@ public LoggingEvent(final String fqnOfCategoryClass, final Category logger, fina
157163
if (properties != null) {
158164
logRecord.setMdc(properties);
159165
}
166+
logContext = null;
160167
}
161168

162-
// our own constructor
169+
// our own constructors
163170

171+
// This one is for testing only!
164172
public LoggingEvent(final ExtLogRecord logRecord, final Category logger) {
165173
this.logRecord = logRecord;
166174
fqnOfCategoryClass = logRecord.getLoggerClassName();
167175
this.logger = logger;
168176
level = JBossLevelMapping.getPriorityFor(logRecord.getLevel());
169177
categoryName = logRecord.getLoggerName();
170178
timeStamp = logRecord.getMillis();
179+
logContext = null;
180+
}
181+
182+
public LoggingEvent(final ExtLogRecord logRecord, final LogContext logContext) {
183+
this.logRecord = logRecord;
184+
fqnOfCategoryClass = logRecord.getLoggerClassName();
185+
level = JBossLevelMapping.getPriorityFor(logRecord.getLevel());
186+
categoryName = logRecord.getLoggerName();
187+
timeStamp = logRecord.getMillis();
188+
this.logContext = logContext;
171189
}
172190

173191
public LocationInfo getLocationInformation() {
@@ -186,6 +204,12 @@ public String getLoggerName() {
186204
}
187205

188206
public Category getLogger() {
207+
Category logger = this.logger;
208+
if (logger == null) {
209+
// lazily populate
210+
assert logContext != null; // otherwise, our `logger` would be populated per constructor
211+
logger = this.logger = JBossLogManagerFacade.getLogger(logContext.getLogger(categoryName));
212+
}
189213
return logger;
190214
}
191215

0 commit comments

Comments
 (0)