我有一个关于登录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);
}
}
}
这是一个好习惯吗? (请注意,小部件是由框架创建的。)
提前感谢您对此
的回答,评论或提示答案 0 :(得分:2)
最好是使用单个静态Logger实例,但允许每个类创建一个私有实例,该实例使用类的名称(可能还有其他信息)进行初始化。然后,此私有实例使用静态实例来实际执行其日志记录,但如果需要可以省略,并减少对外部类的引用。
这就是slf4j
这样做的原因,这是一个你应该考虑使用的日志框架 - 但是你可以用同样的方式自己动手。
请注意,但我不知道如何让您的错误消息显示在对话框中 - 可能需要明确添加。
答案 1 :(得分:2)
您似乎距离JDK Logger的子类只有一步之遥。只有一个静态实例会阻止您在运行时定位特定的类。如果你将Logger子类化,那么你仍然可以拥有许多记录器作为记录类,并保持你的appender的特性。
您也可以制作自己的布局(至少在log4j中,甚至添加占位符 - geronimo都有这样的例子。)