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

时间:2014-07-24 16:27:22

标签: java servlets logging log4j singleton

我正在使用My WebMethods Server,其中包括一个servlet容器。 MWS默认日志记录实现是log4j,所以我可以使用它而不在我的项目中包含任何jar。 由于MWS Root Logger交叉到所有包含的应用程序和服务器实例本身,我不应该使用它。相反,我的方法是为每个应用程序创建一个新的Logger。我在一个属性文件中设置了Logger名称,并打算从servlet的init()方法中读取它。 由于该logger-name参数,我想从页面bean代码中取消Logger的获取。我一直在考虑创建一个Singleton来保存记录器名称并获取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;
    }
}

然后从我的setLoggerName()方法调用init(),从页面bean调用getLoggerInstance()。 这是一个非常糟糕的主意吗?

我一直在阅读有关单身主题的其他帖子,如下所示:

Benefits of Log4j singleton wrapper?

Log4J: Strategies for creating Logger instances

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

PS。请原谅我的英语。我很乐意根据您的意见纠正任何错误拼写或语法错误,并添加任何缺乏信息。

1 个答案:

答案 0 :(得分:0)

您可以在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>