Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 日志消息中事件ID实现的几点看法_Php_Logging_Event Id - Fatal编程技术网

Php 日志消息中事件ID实现的几点看法

Php 日志消息中事件ID实现的几点看法,php,logging,event-id,Php,Logging,Event Id,我有一个logger类(在PHP中,但这并不重要),它可以输出日志消息。记录器是一个自定义实现,运行良好。但是,我想对其进行扩展,为每种类型的记录器消息提供一个事件ID。例如,“用户登录消息”是事件ID 1,“表单验证失败”是事件ID 2 此事件ID的目的是在查看一长串日志时过滤不重要的事件。我相信,按照事件ID对日志进行分类比在数据库中进行子字符串搜索更快,查询也更快 我有以下想法,但欢迎可行的替代方案。我在本例中使用了PHP,但是一些足够通用的东西,可以应用于大多数语言,如PHP/Java/

我有一个logger类(在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中,获取回溯既简单又便宜,在其他语言中,您可能不得不抛出一个异常,这非常令人讨厌。无论如何,这是一个想法


期待您的意见。我的主要要求是可维护性,而不是速度。我目前正朝着第一个方向努力——保持简单

我会选择第一个,稍加修改:

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

Logger::messageWarning($message)
我会用它来代替

Logger::messageWarning($message, EventId:someconstant)
并将EventId类定义为

abstract class EventId {
    const UNSPECIFIED = 1;
    const LOGIN = 2;
    const VALIDATION_FAILURE = 3;
    // etc 
}
您的logger函数将接受第二个参数,但使用默认值
EventId:UNSPECIFIED

class Logger {
...
  function messageWarning($message, $message_type = EventId:UNSPECIFIED) {
    ...
  }
}
这样,您就不会破坏现有代码,也不会进行#3中所述的攻击,并且可以在需要时随时随地通过添加事件类型来替换日志调用