【问题标题】:PHP logging approach across classes跨类的 PHP 日志记录方法
【发布时间】:2012-03-09 06:57:49
【问题描述】:

我创建了一个简单的 LogHelper 类,其中包含我在应用程序中调用的静态方法。我可以这样称呼它:

LogHelper::writeToErrorLog($config->getLogPath(), $exception);  or
LogHelper::writeToErrorLog($config->getLogPath(), $exception, $config->getLogFile);

writeToErroLog 方法如果没有传入一个日志文件名,它会生成一个日志文件名。

我有另一个名为 Config 的类,它基本上采用 XML 文件并通过 getter 和 setter 公开值。这是在应用程序启动时初始化的,包含需要写入错误日志的日志路径。

我的要求是每次运行应用程序都创建一个具有相同文件名的日志文件。当应用程序结束时,日志(如果已填充)将通过电子邮件发送。

我的应用程序还有许多其他用于 DB、解析数据、格式化数据等的类……所有这些都需要在某些时候进行日志记录。我的大部分错误将来自抛出的异常,这些异常会冒泡到父类,由 LogHelper 捕获和处理。在某些情况下,我不想抛出异常,只想记录信息或错误。

我担心的是,我觉得我不断地将配置传递给每个需要记录的类,这感觉不对。此外,我只想为错误日志设置一次文件名。有没有解决这个问题的最佳实践方法?

TIA

东西

【问题讨论】:

  • I create one log file with the same filename per run of the application - 你是怎么做到的?使用随机数还是什么?如果这对您的问题很重要,您应该添加代码。
  • 我已经稍微改变了这个,有时间考虑一下。当我第一次初始化我的应用程序时,我正在设置日志文件名并将其保存回配置对象,因为配置对象无论如何都会在任何地方传递。然后当我调用 LogHelper 时,我从配置对象中提取日志文件名。
  • 我想我的问题应该更关注 OOP,例如当一个对象依赖于另一个对象并且总是需要可用时,最好的方法是什么?我想一种选择可能是将配置对象添加到会话中?
  • 如果您希望您的记录器真正不可知,您可以将配置信息传递给它。例如,Zend 框架通过Zend_Registry 使配置信息在全球范围内可用。考虑下面我的回答,在MyClassName::functionNameHere() 中,您可以将配置对象和异常传递给您的记录器。这样你仍然坚持依赖注入。

标签: php logging


【解决方案1】:

您是否考虑过使用set_exception_handler()?您不必将记录器放在每个类中,它只会处理所有未捕获的异常。您可以在引导过程或其他一些应用程序初始化点中调用它:

set_exception_handler(array("MyClassName", "functionNameHere"));

在该函数中,您可以调用LogHelper::writeToErrorLog()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多