访问Java应用程序中的记录器

时间:2011-02-08 07:57:01

标签: java logging

我有一个关于登录Java应用程序的问题。我想用用户友好的消息记录主要用户操作和可能的错误。因此,我有两个用于记录器的appender:一个在对话框中显示错误(level = error),另一个在当前用户会话的日志中写入html文件,以便用户可以在出现问题时将该文件发回。

为了避免在每个类中创建记录器(私有Logger logger = ...),我在类App中有一个配置记录器的静态引用,它还有访问记录器的方法:

public class App {
    private static Logger logger = Logger.getLogger("logger name");
    …
    public static void logError(String message, Throwable cause) {
    …
    }
    public static void logInfo(String message) {
    …
    }
}

日志记录主要在UI类中完成:

class UIWidget extends UIFrameworkWidget {

    void aMethod() {
        try {
            someBusinessLogic();
        } catch (Exception e) {
            App.logError(“log message”, e);
        }
    }
} 

这是一个好习惯吗? (请注意,小部件是由框架创建的。)

提前感谢您对此

的回答,评论或提示

2 个答案:

答案 0 :(得分:2)

最好是使用单个静态Logger实例,但允许每个类创建一个私有实例,该实例使用类的名称(可能还有其他信息)进行初始化。然后,此私有实例使用静态实例来实际执行其日志记录,但如果需要可以省略,并减少对外部类的引用。

这就是slf4j这样做的原因,这是一个你应该考虑使用的日志框架 - 但是你可以用同样的方式自己动手。

请注意,但我不知道如何让您的错误消息显示在对话框中 - 可能需要明确添加。

答案 1 :(得分:2)

您似乎距离JDK Logger的子类只有一步之遥。只有一个静态实例会阻止您在运行时定位特定的类。如果你将Logger子类化,那么你仍然可以拥有许多记录器作为记录类,并保持你的appender的特性。

您也可以制作自己的布局(至少在log4j中,甚至添加占位符 - geronimo都有这样的例子。)