Openlog: примеры (PHP)
openlog(string $prefix, int $flags, int $facility): boolФункция openlog инициирует соединение с системным логгером (syslog) для последующей записи сообщений через функцию syslog(). Она применяется, когда необходимо направлять логи приложения в централизованную систему журналирования операционной системы.
- ident (string) - Строковый идентификатор, который добавляется к каждому сообщению. Обычно это имя программы.
- option (int) - Целочисленная битовая маска, определяющая параметры логирования. Возможные значения:
- LOG_CONS - Отправлять сообщение на системную консоль при ошибке записи в лог.
- LOG_NDELAY - Немедленно открывать соединение с логгером.
- LOG_ODELAY - Откладывать открытие соединения до первого вызова syslog() (используется по умолчанию).
- LOG_PERROR - Дублировать сообщение в стандартный поток ошибок (stderr).
- LOG_PID - Добавлять к сообщению идентификатор процесса (PID).
- facility (int) - Определяет тип программы, генерирующей сообщение. Влияет на то, как системный логгер обрабатывает и фильтрует записи. Примеры:
- LOG_USER - Общие пользовательские сообщения (по умолчанию).
- LOG_DAEMON - Системные демоны/службы.
- LOG_AUTH - Системы безопасности/авторизации.
- LOG_LOCAL0...LOG_LOCAL7 - Зарезервировано для локального использования.
Открытие лога с именем программы и запись сообщения.
<?php
openlog('MyApp', LOG_PID, LOG_USER);
syslog(LOG_INFO, 'Тестовое сообщение');
closelog();
?>// В системном журнале появляется запись вида: // Jan 1 12:00:00 hostname MyApp[1234]: Тестовое сообщение
Сообщение будет отправлено на консоль при ошибке, содержать PID и дублироваться в stderr.
<?php
openlog('MyScript', LOG_CONS | LOG_PID | LOG_PERROR, LOG_DAEMON);
syslog(LOG_WARNING, 'Обнаружена проблема в демоне');
closelog();
?>// В stderr выводится: MyScript[5678]: Обнаружена проблема в демоне // Соответствующая запись добавляется в системный лог.
Непосредственно записывает сообщение в системный журнал. Требует предварительного вызова openlog или будет использованы параметры по умолчанию.
Закрывает соединение с системным логгером, открытое функцией openlog. Рекомендуется для очистки ресурсов.
Более универсальная функция для отправки ошибок. Может записывать в syslog (при первом параметре 0), в файл или по email. В отличие от пары openlog/syslog, error_log не требует предварительной настройки соединения и предлагает больше вариантов назначения.
Предоставляет богатую иерархическую систему логирования. Для отправки в syslog используется SysLogHandler.
import logging
import logging.handlers
logger = logging.getLogger('MyApp')
logger.setLevel(logging.INFO)
handler = logging.handlers.SysLogHandler(address='/dev/log')
logger.addHandler(handler)
logger.info('Сообщение из Python')Сторонние модули предоставляют функциональность syslog. Встроенные средства отсутствуют.
const syslog = require('syslog');
const logger = syslog.createClient(514, 'localhost');
logger.info('Сообщение из Node.js');
logger.close();СУБД MySQL не имеет прямой аналогии, но ведет собственные журналы (например, общий лог запросов). Настройка осуществляется через системные переменные.
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';Применение несуществующей или неподдерживаемой константы приводит к неожиданному поведению или сообщениям в журнале по умолчанию.
<?php
// Некорректная константа (может не существовать)
openlog('App', LOG_PID, 999);
syslog(LOG_INFO, 'Сообщение');
closelog();
?>// Сообщение может быть записано с facility LOG_USER (по умолчанию) или проигнорировано.
Вызов syslog() до openlog() не приводит к фатальной ошибке, но используются параметры по умолчанию, что может быть нежелательно.
<?php
// openlog не вызыван
syslog(LOG_ERR, 'Критическая ошибка');
?>// Сообщение будет записано, но с идентификатором процесса (script name) и facility LOG_USER.
Начиная с PHP 5.3, функция стала более стабильной в работе с различными реализациями syslog. В PHP 8.0, 8.1 и 8.2 значительных изменений в поведении или сигнатуре функции openlog не было. Однако всегда рекомендуется проверять документацию на предмет исправлений ошибок, связанных с конкретными ОС.
Использование локальной facility и изменение идентификатора в зависимости от части приложения.
<?php
$moduleName = 'PaymentModule';
openlog('MyApp-' . $moduleName, LOG_PID | LOG_NDELAY, LOG_LOCAL0);
syslog(LOG_NOTICE, 'Платежная транзакция начата');
// ... код модуля
syslog(LOG_NOTICE, 'Платежная транзакция завершена');
closelog();
?>Создание функции-обертки для удобного логирования с различными уровнями серьезности.
<?php
function myLogger($level, $message) {
$levels = [
'DEBUG' => LOG_DEBUG,
'INFO' => LOG_INFO,
'WARN' => LOG_WARNING,
'ERROR' => LOG_ERR
];
$syslogLevel = $levels[$level] ?? LOG_INFO;
syslog($syslogLevel, '[API] ' . $message);
}
openlog('ApiService', LOG_PID, LOG_USER);
myLogger('INFO', 'Получен запрос к /users');
myLogger('ERROR', 'Не удалось подключиться к БД');
closelog();
?>Опция LOG_PERROR полезна при отладке скриптов, запущенных из командной строки, так как сообщения дублируются на экран.
<?php
openlog('CronTask', LOG_PID | LOG_PERROR, LOG_CRON);
syslog(LOG_INFO, 'Запуск задания по расписанию');
// Имитация ошибки
if (!file_exists('/tmp/file.txt')) {
syslog(LOG_WARNING, 'Файл не найден, используется значение по умолчанию');
}
closelog();
?>// Кроме записи в системный лог, на экран (stderr) будет выведено: // CronTask[12345]: Запуск задания по расписанию // CronTask[12345]: Файл не найден, используется значение по умолчанию