0

我有一个记录器类(在 PHP 中,但这没关系),它吐出日志消息。记录器是一个自定义实现并且运行良好。但是,我想对其进行扩展,以便为每种类型的记录器消息提供一个事件 ID。例如,“用户登录消息”是事件 ID 1,“表单验证失败”是事件 ID 2。

此事件 ID 的目的是在查看一长串日志时过滤不重要的事件。我相信按事件 ID 对日志进行分类会比在数据库中进行子字符串搜索更快,查询也更快。

我有以下想法,但欢迎可行的替代方案。我在这个例子中使用了 PHP,但是一些足够通用的东西可以应用于大多数语言,比如 PHP/Java/C#/etc 会很有用。

1) 在日志函数调用中隐式包含一个 ID:

abstract class EventId {
    const LOGIN = 1;
    const VALIDATION_FAILURE = 2;
    // etc 
}

Logger::messageDebug(EventID::LOGIN, $username . " logged in"); 
Logger::messageWarning(EventID::VALIDATION_FAILURE, "Form failed to validate, etc.");

这样做的优点是简单,但我担心它会变得有点混乱。

2) 传递可变参数以将消息作为单独的参数记录,然后散列第一个字符串

Logger::messageDebug("%s logged in", $username);
Logger::messageWarning("The %s form failed to validate", $form); 

优点是简单,缺点是事件 ID 取决于第一个字符串的散列(或其他函数)来区分日志消息的类型。

3)回溯并做一些讨厌的事情

function messageDebug($message)  {
    $trace = obtainTraceOfCallToMessageDebug();
    $callToMessageDebug = $trace[0];

    $eventId = "";
    $eventId .= $eventId->file;
    $eventId .= $eventId->line;
    $eventId = sha1($eventId);  

    messageImpl($eventId, $message);
}

这很讨厌,但它确实有一个优点,即不需要更改现有的日志消息,另外在编写新的日志消息时它不那么脆弱。在 PHP 中,获取回溯很容易而且很便宜,在其他语言中,您可能不得不抛出一个非常讨厌的异常。无论如何,这是一个想法。

期待您的意见。我的主要要求是可维护性而不是速度。我目前正在寻找 1 号 - 保持简单。

4

1 回答 1

0

我会选择第一个并稍作修改:

假设您使用以下语句调用记录器:

Logger::messageWarning($message)

我会用

Logger::messageWarning($message, EventId:someconstant)

并将您的 EventId 类定义为

abstract class EventId {
    const UNSPECIFIED = 1;
    const LOGIN = 2;
    const VALIDATION_FAILURE = 3;
    // etc 
}

并且您的记录器函数将接受第二个参数,但为此使用默认值EventId:UNSPECIFIED

class Logger {
...
  function messageWarning($message, $message_type = EventId:UNSPECIFIED) {
    ...
  }
}

这样您就不会破坏现有代码,也不会执行 #3 中概述的 hack,并且可以通过添加事件类型在需要的时间和地点替换您的日志调用。

于 2011-04-20T12:49:48.507 回答