关于在日志消息中实现事件ID的意见

时间:2011-04-20 09:53:47

标签: php logging event-id

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

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

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

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)Backtrace并做一些讨厌

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

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

    messageImpl($eventId, $message);
}

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

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

1 个答案:

答案 0 :(得分: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中概述的黑客攻击,并且可以通过添加事件类型在您需要的地方和时间替换您的日志调用。