2

我应该如何最好地设置一个中央日志记录(或者可能是 2 个,每个都专用于测试或产品)服务器,这样:

我不必担心引用任何条件的代码可能会意外地将非生产错误记录到生产错误 log4j 总线中。换句话说,我不想有这样的代码:

if (!production)
  logWrapper.logTest(error);
else 
  logWrapper.logProd(error);

我不想要这个,因为它紧密耦合了诸如服务器名称之类的东西,引用它,现在代码只能在两个服务器名称之一上工作:prod 和 test。我也不能在配置中声明性地设置它,因为开发人员可能不会正确设置它并污染日志存储库。有什么建议么?

一些细节,有些不会考虑,但我还是列出了它们:

  • 仅在Oracle 应用服务器10.1.3.4上运行的 Web 应用程序,以及未来的 Oracle WebLogic
  • 将使用中央日志服务器,如本示例所示:http ://timarcher.com/?q=node/10 ...除了中央服务器将记录文本文件而不执行电子邮件!
  • 将使用 log4j,也许它会通过 slf4j 包装(slf4j 有点不敬,所以大部分情况下忽略它..)
4

6 回答 6

2

如果没有关于您所在环境的大量详细信息,很难给出具体答案,但如果我设置日志记录以处理多个环境,这就是我要采取的方法。

1) 应用程序不应该关心日志记录。例如,以下内容应适用于所有环境:

logger.warn("message", error);

2)创建一个log4j(或任何日志框架)配置来配置日志。这可以通过以下两种方式之一来完成。第一种方法是为每个环境创建一个 test_log4j.{xml,properties}、prod_log4j.{xml,properties} 等。这使得每个环境的配置都非常简单,添加新环境只是添加一个新文件。另一种方法是创建一个 log4j.{xml,properties} 并使用 ant 样式的属性替换为每个环境插入适当的值。可以从特定于环境的属性文件或从传递给 JVM 的 -Dkey=value 参数中获取属性值。假设每个环境的配置都非常相似,这更像是 DRY 配置风格。作为在环境之间更改日志记录级别的示例:

<logger name="my.example">
  <level value="${my.example.level}"/>
</logger>

3)创建一个确定环境的启动脚本(可能基于机器或机器上的某些文件),然后加载正确的配置。这可以是正确的 log4j 配置、正确的属性文件或正确的 -Dkey=value 参数。

于 2009-04-24T18:24:53.590 回答
1

这个特定问题在logFaces中得到解决,事实上,这是它旨在解决的主要问题之一 - 集中和减少日志泛滥。在您的应用程序配置中。您指定应用程序名称,例如“我的生产应用程序”。来自应用程序的所有日志语句随后将流入集中式日志服务器,并将在存储中用于查询和实时查看。您无需更改代码,这只是配置问题。通常我们在开发中有几个相同应用程序的实例,在 QA 中有几个版本,每个开发人员都可以调整它的查看器以获取其他人正在发生的事情。我经常关注 QA 主持人,甚至在他们意识到之前就知道存在问题。另一个有趣的场景是,当您想同时查看所有应用程序中发生的事情但只关注数据层等情况时。

披露:我是该产品的作者。

于 2009-04-24T21:22:11.947 回答
1

你没有提到你正在使用什么 RDBMS。如果您使用的是 Oracle,则可以使用 SYS_CONTEXT() 函数来获取数据库名称。从那里,您可以确定您是否处于生产/dev/qa/test/etc 中。

这是一篇关于 sys_context() 的好文章

于 2009-04-24T19:27:28.400 回答
0

为生产和登台使用不同的日志记录配置文件。

你可以用几种不同的方式做到这一点

1)在您的应用程序中保留两个不同的配置文件(一个用于阶段,一个用于生产)并让您的应用程序有一些启动代码,这些代码知道根据它所在的机器或应用程序配置文件中的某些设置要使用哪个配置文件设置环境设置。

2) 只需一个文件,但在测试或生产时换出适当的文件。

于 2009-04-24T18:01:41.990 回答
0

我真的认为你需要在配置中设置它。这是一个正确的决定。

于 2009-04-24T18:04:39.377 回答
0

mattkemp 几乎把这个搞定了。我可能要补充的一件事是,我期望生产和测试之间的主要区别是测试版本可能会永久激活调试日志记录,而在生产环境中,您只会在罕见的奇怪行为情况下激活调试日志记录.

除此之外,至少我希望测试和生产中的日志条目类型大致相同,因为在测试期间可能发生的任何事情也可能在生产期间发生(并且将会发生)。

当涉及到服务器设置本身时,我会说只使用 syslog 或 windows NT 事件日志,并使用适当的 log4j 设置。这样,您还可以在同一日志服务器中记录最终系统的其他部分。一个好的日志系统会显示事件是在哪个服务器上生成的,所以应该相当清楚事件是来自 prod 还是 testing。

对于一个好的基于 Web 的系统日志 gui,您可以查看http://www.phplogcon.org/

于 2009-05-07T22:41:33.207 回答