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