使用单例获取log4j Logger实例,以便隔离日志记录器名称



我正在使用My WebMethods Server,它是一个servlet容器。MWS默认的日志记录实现是log4j,所以我可以在不包含任何jar的情况下使用它。由于MWS Root Logger跨到所有包含的应用程序和服务器实例本身,所以我不应该使用它。相反,我的方法是为每个应用程序创建一个新的Logger。我在一个属性文件中设置了Logger的名称,并打算从servlet的init()方法中读取它。由于这个logger-name参数,我想将Logger的获取与页面bean代码解耦。我一直在考虑创建一个Singleton来保存logger的名称并获取logger的实例。

总而言之,我一直在考虑这样做:

package com.webmethods.caf.log;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
public class CAFLogger {
    private static String appLoggerName;
    private static Logger logger;
    private CAFLogger() {
    }
    public static void setLoggerName(String loggerName) {
        if (appLoggerName == null) {
            appLoggerName = loggerName;
        }
    }
    public static Logger getLoggerInstance() {
        if (logger == null) {
            logger = LogManager.getLogger(appLoggerName);
        }
        return logger;
    }
}
然后从我的init()方法调用setLoggerName(),从页面bean调用getLoggerInstance()。这是个坏主意吗?

我一直在阅读其他关于单例主题的帖子,比如:

Log4j单例包装器的好处?

Log4J:创建Logger实例的策略

,但他们都建议使用类名来获取Logger对象,而我需要使用Logger名称。

p。请原谅我的英语。我很乐意根据您的评论纠正任何拼写或语法错误,以及补充任何缺乏的信息。

您可以根据log4j.xmllog4j.properties中的包名定义类别,在这种情况下,您不需要根据其名称获取日志记录器。只需通过类名获取记录器,并根据类别将其记录在适当的appender中。

例如

:

<category name="com.x.y.z.server">
    <priority value="ERROR" />
    <appender-ref ref="SERVER_FILE_LOG" />
</category>
<category name="com.x.y.z.client">
    <priority value="ERROR" />
    <appender-ref ref="CLIENT_FILE_LOG" />
</category>

最新更新