From 12a7861a4b1d5eb50e48758b9e69f868c50bde67 Mon Sep 17 00:00:00 2001 From: John Vasileff Date: Sun, 18 Sep 2011 19:12:36 -0400 Subject: [PATCH 2/4] fix for Category.getInstance returning cached Logger When creating new Category instances, the Category class passed a custom Factory to context.getLogger(factory, name). The factory created loggers of type CategoryFactory.CategoryLogger, and code in the Category class casted the logger to this type. The problem was that context.getLogger(factory, name) only uses the provided factory if it has to create a new logger. Cached loggers would simply be returned. If the cached logger was created using a different factory, it was not of type CategoryFactory.CategoryLogger and a ClassCastException would occur during operations that called isEnabledFor or forcedLog. --- .../src/main/java/org/apache/log4j/Category.java | 50 ++----------------- .../java/org/apache/logging/log4j/core/Logger.java | 18 ++++---- 2 files changed, 15 insertions(+), 53 deletions(-) diff --git a/log4j12-api/src/main/java/org/apache/log4j/Category.java b/log4j12-api/src/main/java/org/apache/log4j/Category.java index 8949e64..e0bb585 100644 --- a/log4j12-api/src/main/java/org/apache/log4j/Category.java +++ b/log4j12-api/src/main/java/org/apache/log4j/Category.java @@ -16,7 +16,6 @@ */ package org.apache.log4j; -import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.helpers.NameUtil; import org.apache.logging.log4j.message.LocalizedMessage; @@ -40,8 +39,6 @@ public class Category { private static final Map> CONTEXT_MAP = new WeakHashMap>(); - private static final CategoryFactory FACTORY = new CategoryFactory(); - private static final String FQCN = Category.class.getName(); /** @@ -57,7 +54,7 @@ public class Category { * @param name The name of the Logger. */ protected Category(LoggerContext context, String name) { - this.logger = context.getLogger(getFactory(), name); + this.logger = context.getLogger(name); } /** @@ -95,7 +92,6 @@ public class Category { return getInstance(clazz.getName()); } - static Category getInstance(LoggerContext context, Class clazz) { return getInstance(context, clazz.getName()); } @@ -249,12 +245,12 @@ public class Category { public boolean isEnabledFor(Priority level) { org.apache.logging.log4j.Level lvl = org.apache.logging.log4j.Level.toLevel(level.toString()); - return ((CategoryFactory.CategoryLogger) logger).isEnabledFor(lvl); + return isEnabledFor(lvl); } public void forcedLog(String fqcn, Priority level, Object message, Throwable t) { org.apache.logging.log4j.Level lvl = org.apache.logging.log4j.Level.toLevel(level.toString()); - ((CategoryFactory.CategoryLogger) logger).log(null, fqcn, lvl, new ObjectMessage(message), t); + logger.log(null, fqcn, lvl, new ObjectMessage(message), t); } public boolean exists(String name) { @@ -305,10 +301,6 @@ public class Category { } } - protected org.apache.logging.log4j.spi.LoggerFactory getFactory() { - return FACTORY; - } - /** * Private logger factory. */ @@ -334,38 +326,8 @@ public class Category { } } - /** - * Private Category factory. - */ - private static class CategoryFactory implements org.apache.logging.log4j.spi.LoggerFactory { - - public org.apache.logging.log4j.core.Logger newInstance(LoggerContext ctx, String name) { - return new CategoryLogger(ctx, name); - } - - /** - * Category Logger. - */ - public class CategoryLogger extends org.apache.logging.log4j.core.Logger { - - public CategoryLogger(LoggerContext ctx, String name) { - super(ctx, name); - } - - @Override - public String getFQCN() { - return FQCN; - } - - @Override - public void log(Marker marker, String fqcn, org.apache.logging.log4j.Level level, - Message data, Throwable t) { - super.log(marker, fqcn, level, data, t); - } - - public boolean isEnabledFor(org.apache.logging.log4j.Level level) { - return isEnabled(level, null, null); - } - } + private boolean isEnabledFor(org.apache.logging.log4j.Level level) { + return logger.isEnabled(level, null, null); } + } diff --git a/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java b/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java index 46c1c11..a99380b 100644 --- a/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java +++ b/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java @@ -104,48 +104,48 @@ public class Logger extends AbstractLogger { } @Override - protected void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { + public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { config.loggerConfig.log(name, marker, fqcn, level, data, t); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg) { + public boolean isEnabled(Level level, Marker marker, String msg) { return config.filter(level, marker, msg); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg, Throwable t) { + public boolean isEnabled(Level level, Marker marker, String msg, Throwable t) { return config.filter(level, marker, msg, t); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg, Object p1) { + public boolean isEnabled(Level level, Marker marker, String msg, Object p1) { return config.filter(level, marker, msg, p1); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2) { + public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2) { return config.filter(level, marker, msg, p1, p2); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3) { + public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3) { return config.filter(level, marker, msg, p1, p2, p3); } @Override - protected boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3, + public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3, Object... params) { return config.filter(level, marker, msg, p1, p2, p3, params); } @Override - protected boolean isEnabled(Level level, Marker marker, Object msg, Throwable t) { + public boolean isEnabled(Level level, Marker marker, Object msg, Throwable t) { return config.filter(level, marker, msg, t); } @Override - protected boolean isEnabled(Level level, Marker marker, Message msg, Throwable t) { + public boolean isEnabled(Level level, Marker marker, Message msg, Throwable t) { return config.filter(level, marker, msg, t); } -- 1.7.6