Java Log4J-如何记录导入库中捕获的异常?

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,添加到我的主应用程序

我是log4jv的新用户。1.2.15,作为我的一个朋友,我确信它比控制台或其他形式的日志记录更具优势。然而,当我在做一些测试时,我遇到了一个让我思考的测试用例。这就是我所做的:

  • 我已经配置了属性,添加了2个appender、一个
    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;
       }