Мнения о реализации идентификаторов событий в сообщениях журнала

У меня есть класс logger (в PHP, но это не имеет значения), который выплевывает сообщения журнала. Регистратор представляет собой пользовательскую реализацию и работает хорошо. Тем не менее, я хотел бы расширить его для предоставления идентификатора события для каждого типа сообщения журнала. Таким образом, что "Пользователь зарегистрировался в сообщениях" - это событие с кодом 1, "Ошибка проверки формы" - это, например, событие с кодом 2.

Цель этого идентификатора события - фильтровать неважные события при просмотре длинного списка журналов. Я считаю, что было бы быстрее классифицировать журналы по идентификатору события и быстрее выполнять запросы, чем выполнять поиск по подстроке в базе данных.

У меня есть следующие идеи, но приветствуются жизнеспособные альтернативы. Я использовал PHP в этом примере, но было бы полезно кое-что достаточно универсальное, чтобы его можно было применять к большинству языков, таких как PHP/Java/C#/etc.

1) Включите идентификатор неявно в вызов функции журнала:

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); 

Преимуществами являются простота, недостатки в том, что идентификатор события зависит от хеширования (или какой-либо другой функции) первой строки, чтобы различать типы сообщений журнала.

3) Отследить и сделать немного мерзости

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

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

    messageImpl($eventId, $message);
}

Это довольно неприятно, но у него есть преимущество в том, что существующие сообщения журнала не нужно менять, кроме того, он менее хрупок при написании новых сообщений журнала. В PHP получить обратную трассировку легко и дешево, в других языках вам может потребоваться создать исключение, которое является очень неприятным. Во всяком случае, это идея.

Ждем ваших мнений. Мое главное требование - ремонтопригодность, а не скорость. В настоящее время я смотрю на номер 1 - будь проще.

1 ответ

Решение

Я бы пошел с первым с небольшой модификацией:

Предполагая, что вы вызвали ваш логгер с такими утверждениями, как:

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, и можете заменить ваши вызовы в журнале, где и когда вам нужно, добавив тип события.

Другие вопросы по тегам