2009-11-26 62 views
0

我目前正在研究用Java编写的Linux守护进程。日志的通用命名机制是什么?用log4j组织日志

现在我想这样做类似的:

DEBUG = /var/log/myapp.debug
信息 = /var/log/myapp.info
WARN = /var/log/myapp.warn
ERROR = /var/log/myapp.err
FATAL = /var/log/myapp.err

有谁对命名方案的任何意见/建议吗?我会接受我最终决定的答案。

希望这个问题没有得到关闭,因为有相似的其他主题是认为相关的(像什么IDE你喜欢等)

回答

2

我会使用以下方案进行应用日志:

/var/log/<app>/myapp.log 

换句话说,一切都成一个文件,无论日志级别(已经有足够的复杂性,当你有一个日志文件每个实例在集群多层环境中,不需要更多)。您通常在开发过程中使用DEBUG,在生产中使用ERROR(有时为了监控目的使用另一种模式布局,但这是另一个故事)。日志级别可能会根据特定记录器的需求而更改。

+0

非常好的一点,我没有从缩放的角度考虑它。我想最终只会出于一个特定的原因,如果有的话,最好只有一个日志文件。 – William 2009-11-27 16:09:44

1

对于Java应用程序,我推荐两个日志。

第一个是过程开始的stderr和stdout。配置log4j将ERROR和FATAL发送到CONSOLE和FILE。

第二个日志应该由log4j管理,并且包括所有的DEBUG - FATAL错误。这将是您在调试复杂问题时需要的详细日志。在你的log4j中,调整DEBUG和INFO过滤器以不显示你不关心的软件包。例如,您通常不需要org.apacheorg.jbossDEBUG级别。

对于结构,我会做到以下几点:

/var/log/myapp/boot.log.$(date +%s) 
/var/log/myapp/server.log.$(date +%Y%m%d) 

server日志每日轮播,同时启动日志将创建在每次启动一个新的文件。

将DEBUG,INFO等分离到自己的日志文件中是没有意义的,因为您通常需要来自不同日志级别的上下文才能在同一个文件中。

如果不捕捉过程stderr日志,你将无法捕捉使用kill -3,你不会看到像Stale NFS handle系统错误消息的堆栈跟踪,你不会得到的细节JVM崩溃。

+0

谢谢你的建议。守护进程并没有真正做多的系统重新启动时,这将永远是相关的唯一的事情是,如果它未能启动,然后我有种想看到,在我的主要错误日志(我不知道为什么我首先将他们分开)+1的建议。 – William 2009-11-27 16:10:56

1

我强烈建议你使用一个日志,而不是几个你提出,这是因为:

  • 日志输出包含足够的信息(例如,“[错误]”)由水平进行筛选。
  • 不同层次的记录语句的相对顺序或者不能被重建(没有时间戳被包括)或是不平凡的重建(包括时间戳)当由电平分割成单独的文件。

至于发生的日志量...这可能应该是动态配置的(也许你想为此使用XML或Java属性配置文件?)。警告或错误是一个合理的日志记录级别用作默认值。在开发过程中,启用更精细的日志记录有时很有用。

+0

我使用log4j的库里面确实有一个很好的自定义配置文件。我其实本来做这种方式(1个文件,显示水平,时间戳等),但我想让它更容易找到具体问题,而不必到grep文件。但帕斯卡说,一个文件更容易管理。 +1的建议。看起来你们三个人都帮我找到了我的解决方案。 – William 2009-11-27 16:13:23