我正在使用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.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>