• Блог
  • Отдельный лог для сообщений

В некоторых случаях необходимо логировать пользовательские действия, но мешать их с системными сообщениями в логе MODX не хочется. Я покажу небольшой лайфхак как это сделать с помощью доступного API и компонента ControlErrorLog. Всё достаточно просто. В метод modX::log() можно передать все необходимые параметры. В нашем случае мы можем передать новое имя файла для логирования. Также можно передать и путь, если файл должен располагаться в другом месте. Но тогда для ControlErrorLog он будет недоступен. Итак, как это сделать?

В третьем параметре этого метода нужно передать массив с определёнными опциями.

// Запись ошибки в файл test.log
$modx->log(1, 'Сообщение об ошибке.', [
    "target" => "FILE",  // Запись в файл. Доступно ECHO и HTML.
    "options" => [
        "filename" => "new_file.log", // Имя файла
        "filepath" => "абсолютный/путь/до/файла/", // Новое месторасположение файла лога. Можно не указывать.
    ]
]);

Данная запись появится в файле, если текущий уровень ошибок равен единице и больше. Этот уровень выставляется в системной настройке log_level. Обычно она равна 1. А значит вы можете записать в файл только ошибки уровня Error(1) и Fatal(0). Но для логирования пользовательских действий может пригодится уровень Info(3). Для этого случая уровень логирования нужно временно переопределить.

// Указываем уровень INFO и запоминаем старый уровень
$old = $modx->setLogLevel(3);
// Записываем сообщение
$modx->log(3, 'Сообщение о действии', ["target" => "FILE", "options" => ["filename" => "test.log"]]);
// Восстанавливаем старое значение
$modx->setLogLevel($old);

Для удобной работы можно создать сниппет или функцию.

if (!function_exists('custom_log')) {
    function custom_log($message, $level = 1, $filename = 'error.log') {
        global $modx;

        $old = $modx->setLogLevel($level);
        $modx->log($level, $message, ["target" => "FILE", "options" => ["filename" => $filename]]);
        $modx->setLogLevel($old);
    }
}

Эту функцию можно зарегистрировать в плагине на событие OnHandleRequest и дальше пользоваться ей где угодно. А в админке с помощью компонента ControlErrorLog можно выбрать и посмотреть указанный файл лога.

Вот такой лайфхак. Пользуйтесь на здоровье.

0   1851

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.