У меня есть класс 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 - будь проще.