如何为Java应用程序设计日志结构

3

我是一名 Java 初学者,我知道 Java 有 Log4J、logback 等用于日志记录的工具。我的问题更多地涉及一个应用程序应该有多少个日志文件。它应该是每个线程、一组线程、进程、异常等。在我们的应用程序中,可能会有大量的线程,我正在考虑每个线程都有日志文件的缺点。在具有大量线程的应用程序中,是否有最佳实践来记录日志。

谢谢!


1
你为什么要首先登录呢? - UmNyobe
3个回答

3

有四个日志文件:

1个记录消息的日志文件 - 叫做SystemOut.log

1个记录堆栈跟踪的日志文件 - 叫做SystemErr.log

1个记录跟踪信息的日志文件 - 叫做Trace.log

1个记录本地stdout的日志文件 - 叫做nativeStdOut.log

1个记录本地stderr的日志文件 - 叫做nativeStdErr.log

拥有一个配置面板,可以设置:

 maxSize
 maxCount

当日志达到最大大小时,将它们滚动到最大计数,并在已滚动的文件名后附加时间戳。


0
通常每个应用程序(进程)都有一个日志文件,很少有Thread的,也从来没有Exception的。有时,这个日志文件会分成不同的日志级别:一个桶中包含调试消息,另一个桶中包含信息,第三个桶中包含警告/错误。这样只需查看警告及更严重的文件就可以轻松地查找错误。 log4j有一个配置文件,您可以在其中使用不同的条件将某些消息路由到某些文件中。以下是log4j属性文件的示例:
# default is WARN and above going to the appender "logfile" and STDOUT
log4j.rootLogger=WARN, logfile, stdout
# write to ui.log for a day and then move to .yyyy-MM-dd suffix
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=ui.log
log4j.appender.logfile.Append=true
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
# but we log information message from classes in the package com.mprew.be
log4j.logger.com.mprew.be=INFO

log4j,以及自定义的记录器,会在每个时间点上添加类名、优先级、日期/时间等。例如:

# date     time        priority  Class-name  Log message
2012-03-26 00:55:39,545 [INFO] CmsClientTask Content is up-to-date

通常异常会被写成多行,这样你就可以获取整个堆栈跟踪。
2012-03-26 01:55:35,777 [INFO] ExceptionInterceptor Reporting problem to customer
    org.springframework.NoSuchRequestException: No request handling method
     at com.ui.base.BaseController.invokeNamedHandler(BaseController.java:240)
     at com.ui.base.BaseController.handleRequestInternal(BaseController.java:100)
     at com.ui.base.CoreServices.handleRequest(CoreServicesController.java:147)
     ...

在我们的分布式系统中,我们将所有系统的日志路由到2个服务器,这些服务器会写入调试、信息和警告日志。除了日期/时间、类名、优先级和消息之外,日志消息还包括主机名和特定的日志令牌,以便我们可以轻松地识别问题类别。以下是一行内容:
2012-03-26 00:00:00.045 UTC INFO FE8 TrayController TRAY_CLIENT_LOOKUP
    message=created unknown client with partner STW9

然后我们可以轻松地grep特定的问题。
希望这能帮到你。

0

我认为一个好的解决方案是给你的线程命名,并在日志中写下发生日志的线程名称。这样,你就可以分别分析每个线程的日志,或者一起分析所有日志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接