Openlog: примеры (PHP)

Системное логирование через функцию openlog в PHP
Раздел: Логирование
openlog(string $prefix, int $flags, int $facility): bool
Функция openlog в PHP

Функция 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]: Обнаружена проблема в демоне
// Соответствующая запись добавляется в системный лог.
Похожие функции в PHP

Непосредственно записывает сообщение в системный журнал. Требует предварительного вызова openlog или будет использованы параметры по умолчанию.

Закрывает соединение с системным логгером, открытое функцией openlog. Рекомендуется для очистки ресурсов.

error_log()

Более универсальная функция для отправки ошибок. Может записывать в syslog (при первом параметре 0), в файл или по email. В отличие от пары openlog/syslog, error_log не требует предварительной настройки соединения и предлагает больше вариантов назначения.

Аналоги в других языках
Python: модуль logging

Предоставляет богатую иерархическую систему логирования. Для отправки в 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')
Node.js (JavaScript): модуль 'syslog' или 'winston'

Сторонние модули предоставляют функциональность syslog. Встроенные средства отсутствуют.

const syslog = require('syslog');
const logger = syslog.createClient(514, 'localhost');
logger.info('Сообщение из Node.js');
logger.close();
MySQL: журнал общих запросов

СУБД MySQL не имеет прямой аналогии, но ведет собственные журналы (например, общий лог запросов). Настройка осуществляется через системные переменные.

SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
Типичные ошибки
Использование неверной константы facility

Применение несуществующей или неподдерживаемой константы приводит к неожиданному поведению или сообщениям в журнале по умолчанию.

<?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

Начиная с PHP 5.3, функция стала более стабильной в работе с различными реализациями syslog. В PHP 8.0, 8.1 и 8.2 значительных изменений в поведении или сигнатуре функции openlog не было. Однако всегда рекомендуется проверять документацию на предмет исправлений ошибок, связанных с конкретными ОС.

Расширенные примеры
Логирование с динамическим идентификатором и локальной facility

Использование локальной facility и изменение идентификатора в зависимости от части приложения.

Пример php
<?php
$moduleName = 'PaymentModule';
openlog('MyApp-' . $moduleName, LOG_PID | LOG_NDELAY, LOG_LOCAL0);
syslog(LOG_NOTICE, 'Платежная транзакция начата');
// ... код модуля
syslog(LOG_NOTICE, 'Платежная транзакция завершена');
closelog();
?>
Обработка разных уровней ошибок

Создание функции-обертки для удобного логирования с различными уровнями серьезности.

Пример php
<?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 для отладки

Опция LOG_PERROR полезна при отладке скриптов, запущенных из командной строки, так как сообщения дублируются на экран.

Пример php
<?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]: Файл не найден, используется значение по умолчанию

PHP openlog function comments

En
Openlog Open connection to system logger