Java Log4J-如何记录导入库中捕获的异常?
我是log4jv的新用户。1.2.15,作为我的一个朋友,我确信它比控制台或其他形式的日志记录更具优势。然而,当我在做一些测试时,我遇到了一个让我思考的测试用例。这就是我所做的:Java Log4J-如何记录导入库中捕获的异常?,java,exception-handling,log4j,Java,Exception Handling,Log4j,我是log4jv的新用户。1.2.15,作为我的一个朋友,我确信它比控制台或其他形式的日志记录更具优势。然而,当我在做一些测试时,我遇到了一个让我思考的测试用例。这就是我所做的: 我已经配置了属性,添加了2个appender、一个ConsoleAppender和一个RollingFileAppender 我已经使用我的主类创建了一个新的日志实例:Logger mainLogger=Logger.getLogger(main.class) 我在一个名为 MyUtils.jar,添加到我的主应用程序
ConsoleAppender
和一个RollingFileAppender
Logger mainLogger=Logger.getLogger(main.class)代码>
MyUtils.jar
,添加到我的主应用程序的类路径。在主应用程序中,我从MyUtils.jar
调用了一个静态方法。此方法有一个try-catch{}块,在那里处理异常,使用System.err打印堆栈跟踪。
现在,使用我的IDE和控制台pender
,我能够发现问题,但是,事件没有记录在我的文件日志中。这里有两个问题需要回答:
a.我目前正在使用我的mainLogger
记录我应用程序所有类别的事件。这是个好习惯吗?或者我应该为X类使用X记录器实例吗?
b.如何记录导入中已捕获的错误?
这听起来可能微不足道,但我使用了objectfoo=MyLibrary.composeObjectFoo()
,
方法内部类似于此示例:
public static Object composeObjectFoo() {
try {
.....statements.....
.
.
// something stupid here
int a = 100/0; //an AritmethicException will be thrown
} catch Exception(e) {
e.printStackTrace();
}
}
我做了一件合乎逻辑的事情..我已经从我的Utils类中删除了try->catch{}块。生成的异常现在被主应用程序捕获并记录。令人惊叹的!但是……有没有任何保证,在使用第三方创建的libs/utils时,这种情况不会重演 我做了一件合乎逻辑的事情..我已经从我的Utils类中删除了try->catch{}块。生成的异常现在被主应用程序捕获并记录。令人惊叹的!但是……有没有任何保证,在使用第三方创建的libs/utils时,这种情况不会重演 关于日志记录,我有几点建议:
System.out.println()
,System.err.println()
,或e.printStackTrace()
。相反,使用记录器。您可以将记录器配置为打印到stdout或stderr,更不用说过滤掉不重要的信息。更加灵活logger.getLogger(Main.class)
)。通过这样做,您可以使用所有这些唯一的记录器名称来微调日志过滤。例如,如果需要,可以将类别A设置为debug
,将类别B设置为info
我还建议您仔细阅读一下异常处理最佳实践。每个人都会争论什么是“最好的”,但大家都应该同意,你应该做的不仅仅是让一切泄漏到
main()
。我喜欢我要说的。关于日志记录,我有几点建议:
System.out.println()
,System.err.println()
,或e.printStackTrace()
。相反,使用记录器。您可以将记录器配置为打印到stdout或stderr,更不用说过滤掉不重要的信息。更加灵活logger.getLogger(Main.class)
)。通过这样做,您可以使用所有这些唯一的记录器名称来微调日志过滤。例如,如果需要,可以将类别A设置为debug
,将类别B设置为info
我还建议您仔细阅读一下异常处理最佳实践。每个人都会争论什么是“最好的”,但大家都应该同意,你应该做的不仅仅是让一切泄漏到
main()
。我喜欢你说的。你不能记录导入库中捕获的异常。无法将代码添加到导入的库中。一旦被抓住,你就完蛋了。您最好希望导入的库重新抛出一个异常,并给您一个记录某些内容的机会
我想知道一个导入的库的质量如何,它没有做日志记录,而是写入控制台。这不是一个好的设计概念
我不喜欢让主类做日志记录的想法。你的直觉是好的,但你的实施却不是。日志记录是一个贯穿各领域的问题,应该使用面向方面的编程来完成。您不能记录导入库中捕获的异常。无法将代码添加到导入的库中。一旦被抓住,你就完蛋了。您最好希望导入的库重新抛出一个异常,并给您一个记录某些内容的机会 我想知道一个导入的库的质量如何,它没有做日志记录,而是写入控制台。这不是一个好的设计概念 我不喜欢让主类做日志记录的想法。你的直觉是好的,但你的实施却不是。日志记录是一个交叉关注点,应该使用面向方面的编程来完成 a。我目前正在使用我的mainLogger 记录我的所有类的事件 应用程序。这样行吗
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable exc) {
//do something about it
}
});
public double computeValue(int val){
double a = 15/val;
return a;
}