目前我们在WebSphere Portal Server上运行了不少应用程序,并且大多数应用程序都有自己的日志文件,因此System.out不会过载。但是,一旦应用程序中发生错误,很容易错过。如果记录了错误,我想在System.out中收到警告,并发出通知以查看相关的日志文件。现在我通过将log4j记录器包装到与logger-class具有相同方法的类中来完成此操作,并且它只是将所有调用委托给记录器。只有在调用error-and fatal-messages方法时,才会从记录器中检索要登录的文件,并向System.out写入警告。这工作正常,但现在LoggerWrapper是记录器方法的调用者,因此作为调用者而不是原始调用者被写入日志文件。
有没有办法解决这个问题,甚至采用完全不同的方法?我想避免重写所有异常处理程序以将消息添加到System.out本身。
基督教
答案 0 :(得分:2)
您可以简单地将Log4J appender配置为写入stdout(在本例中为stderr)。这是标准方式。通过将日志阈值设置为WARNING,您可以过滤掉大量日志消息。
价格是错误消息将出现在stderr和日志文件中,但对我来说这不是问题。实际上,它可能有助于查找与给定stderr消息相对应的特定日志。
答案 1 :(得分:0)
我在我们的应用程序中做了类似的事情,我在其中管理所有日志记录。
我通过将“ErrorConsoleAppender”附加到我的根记录器来解决了这个问题。我的配置文件中的所有记录器都是附加的(当然,这意味着它们会“适当地冒泡”)。
正如人们所怀疑的那样,“ErrorConsoleAppender”会将错误推送到控制台并且只会出错。它对我们来说效果非常好,保持我们的控制台清洁,除非出现严重问题。我的代码如下:
...
<appender name="ErrorConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ABSOLUTE}] %-5p > %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
...
<root>
<priority value="ALL" />
<appender-ref ref="ErrorConsoleAppender" />
</root>
当然,要按照您描述的方式进行此工作,您必须添加简单的log.error(String)调用,这些调用不会转储堆栈跟踪,如上面Peter所建议的那样。
<小时/> 如果编辑log.error(String)调用不实用,那么我建议使用AspectJ来横切代码并提供所需的功能。即使您不熟悉面向方面的编程,实现您所描述的内容也相当简单。实际上,AOP的主要用例之一正是您所描述的场景。方面非常适合记录。
从表面上看,在你的情况下,似乎最合适的方法是使用“抛出后”语法在特定异常发生时采取适当的记录操作。
我希望所有这些都有所帮助,如果您对AOP如何解决您的问题有进一步的疑问,请告诉我,
-gMale
答案 2 :(得分:0)
感谢您的想法。在内部讨论之后,我最终编写了一个简单的appender,它附加到所有记录器,并在记录错误或致命消息时向System.out输出一个简短的通知。由于appender可以访问调用记录器,因此它可以分析所有其他appender并找出他们登录的位置,并将其添加到通知中。
基督教