我正在使用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。请原谅我的英语。我很乐意根据您的意见纠正任何错误拼写或语法错误,并添加任何缺乏信息。
答案 0 :(得分:0)
您可以在log4j.xml
或log4j.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>