2014-07-24 100 views
0

我正在使用My WebMethods Server,它是一个servlet容器。 MWS缺省日志记录实现是log4j,所以我可以在我的项目中不包含任何jar的情况下使用它。 由于MWS Root Logger与所有包含的应用程序和服务器实例本身交叉,因此我不应该使用它。相反,我的方法是为每个应用程序创建一个新的Logger。我在属性文件中设置Logger名称,并打算从Servlet的init()方法中读取它。 由于logger-name参数,我想从页面bean代码中分离获取Logger。我一直在想创建一个保存记录器名称并获取Logger实例的Singleton。使用单例获取log4j 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()getLoggerInstance()从页面豆类。 这是一个非常糟糕的主意吗?

我一直在阅读有关的单身话题的其他职位,如下所示:

Benefits of Log4j singleton wrapper?

Log4J: Strategies for creating Logger instances

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

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

回答

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> 
+0

东西我忘了说的是,大多数类相同的封装结构,在所有应用中,即以'com.webmethods.caf'开始,尽管他们属于该应用程序,每个屏幕都有一个包,例如'com.webmethods.caf.screen1'。通过类名来定义类别将会很困难。这就是为什么我使用记录器名称而不是类来获取记录器对象。 – DiegoAlfonso