Эффективное, быстрое и стабильное расширение для логирования в PHP
@Autowired Чито Гао [neeke@php.net]
@Общение 312910117
Сборка логов> ---
Логи обычно являются записями работы системы или программного обеспечения. Анализ логов позволяет пользователям легко понять состояние работы системы или программы; если логи достаточно подробны, можно анализировать поведение пользователей в прошлом, типы действий, географическое распределение или другие данные. Если логи также разделены на различные уровни, это значительно облегчает анализ состояния здоровья приложения, своевременное выявление проблем и быстрое решение.PHP имеет встроенные функции error_log
и syslog
, которые мощны и эффективны, но имеют множество недостатков (например, отсутствие уровня ошибок в error_log
, отсутствие фиксированной формы записи, отсутствие модульности в syslog
и смешивание с системными журналами), что снижает их гибкость и делает их непригодными для многих приложений.
К счастью, существуют несколько сторонних библиотек для логирования, таких как log4php
, plog
, Analog
и другие (включая многие проекты, где логи были созданы самостоятельно). Из них наиболее известна log4php, которая отличается высокой качественной разработкой, идеальным форматом, полной документацией и мощными возможностями. Рекомендую.
Однако log4php
демонстрирует очень плохие показатели производительности. Ниже приведена сравнительная тестовая диаграмма производительности SealLog
против log4php
(тестовое окружение: Ubuntu 12.04, процессор Intel i3, память 16 ГБ, жесткий диск SATA 7200 rpm):
Так или иначе, существует ли библиотека для логирования, удовлетворяющая следующим требованиям?
SeasLog
был создан именно для удовлетворения этих требований.$ /path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
$ make && make install
$ pecl install seaslog
Перейдите на страницу PECL/SeasLog для скачивания соответствующего dll файла PECL/SeasLog Windows DLL### Конфигурация seaslog.ini
[SeasLog]
; Настройки модуля PHP SeasLog
extension = seaslog.so
; Корневой каталог логов по умолчанию
seaslog.default_basepath = "/var/log/www"
; Префикс для имени файла лога по умолчанию, например "app-", по умолчанию пустая строка
seaslog.default_file_prefix = ""
; Разделитель даты и времени для имени файла лога по умолчанию, например "-", по умолчанию пустая строка
seaslog.default_file_datetime_separator = ""
; Имя logger'а по умолчанию
seaslog.default_logger = "default"
; Формат даты по умолчанию "Y-m-d H:i:s"
seaslog.default_datetime_format = "Y-m-d H:i:s"
; Шаблон записи лога по умолчанию "%T | %L | %P | %Q | %t | %M"
seaslog.default_template = "%T | %L | %P | %Q | %t | %M"
; Отделение директорий для каждого logger'а 1 - да (по умолчанию), 0 - нет
seaslog.disting_folder = 1
; Разделение файлов по типу сообщения 1 - да, 0 - нет (по умолчанию)
seaslog.disting_type = 0
; Разделение файлов по часам 1 - да, 0 - нет (по умолчанию)
seaslog.disting_by_hour = 0
; Включение буферизации 1 - да, 0 - нет (по умолчанию)
seaslog.use_buffer = 0
; Размер буфера по умолчанию 0 (не использовать)
seaslog.buffer_size = 100
; Отключение буферизации при запуске через командную строку
; 1 - да, 0 - нет (по умолчанию)
seaslog.buffer_disabled_in_cli = 0
```; Уровень записи логов, чем больше число, тем больше записей будет сделано
; 0-ЭМЕРГЕНСИ 1-АЛЭРТ 2-КРИТИКАЛЬ 3-ОШИБКА 4-ПРЕДУПРЕЖДЕНИЕ 5-НАЧАЛО 6-ИНФОРМАЦИЯ 7-ДИАГНОСТИКА 8-ВСЕ
; По умолчанию 8 (все уровни)
;
; Обратите внимание, что это значение было изменено начиная с версии 1.7.0.
; До версии 1.7.0, меньшее число значений приводило к большему количеству записей:
; 0-все 1-диагностика 2-информация 3-начало 4-предупреждение 5-ошибка 6-критическая 7-альерт 8-эмерджэнси
; В версиях до 1.7.0 значение по умолчанию равно 0 (все уровни).
seaslog.level = 8; Глубина отката вызова функции
; влияет на количество строк в переменной %F
; по умолчанию 0
seaslog.recall_depth = 0
; Автоматическая регистрация сообщений типа notice 0 - выключена (по умолчанию)
seaslog.trace_notice = 0
; Автоматическая регистрация предупреждений 0 - выключена (по умолчанию)
seaslog.trace_warning = 0
; Автоматическая регистрация ошибок 1 - включена (по умолчанию)
seaslog.trace_error = 1
; Автоматическая регистрация информации об исключениях 0 - выключена (по умолчанию)
seaslog.trace_exception = 0
; Медиум хранения логов 1-Файл 2-TCP 3-UDP (по умолчанию 1)
seaslog.appender = 1
; Количество попыток повторной записи
; по умолчанию 0 (не повторять)
seaslog.appender_retry = 0
```; принимаемый ip по умолчанию 127.0.0.1 (обязательно при использовании TCP или UDP)
seaslog.remote_host = "127.0.0.1"
; принимаемый порт по умолчанию 514 (обязательно при использовании TCP или UDP)
seaslog.remote_port = 514
; время ожидания для принятого порта по умолчанию 1 секунду
seaslog.remote_timeout = 1
; фильтрация символов возврата каретки и новой строки в логах (по умолчанию 0)
seaslog.trim_wrap = 0
; включение выбрасывания исключений SeasLog 1 - включено (по умолчанию), 0 - выключено
seaslog.throw_exception = 1
; игнорирование предупреждений SeasLog 1 - включено (по умолчанию), 0 - выключено
seaslog.ignore_warning = 1
; включение отслеживания производительности 1 - включено, 0 - выключено (по умолчанию)
seaslog.trace_performance = 0
; процент выборки для отслеживания производительности
; по умолчанию 10, то есть 1%
seaslog.trace_performance_sample_rate = 10```; начальный уровень для отслеживания производительности по умолчанию 1
seaslog.trace_performance_start_depth = 1
; максимальный уровень глубины для отслеживания производительности по умолчанию 5
seaslog.trace_performance_max_depth = 5
; максимальное количество функций на каждый уровень глубины для отслеживания производительности по умолчанию 5
seaslog.trace_performance_max_functions_per_depth = 5
; минимальное значение времени выполнения запроса для записи производительности по умолчанию 1000 мс
seaslog.trace_performance_min_wall_time = 1000
; минимальное значение времени выполнения метода для участия в расчете производительности по умолчанию 10 мс
seaslog.trace_performance_min_function_wall_time = 10
```plaintext
> `seaslog.distinguishing_folder = 1` Включает разделение логов по директориям, то есть logger использует директории для разделения. Когда это отключено, logger объединяет имя с временем через нижнее подчеркивание, например default_20180211.log.
> `seaslog.distinguishing_type = 1` Включает разделение логов по типу, то есть log файлы будут разделены по типам info/warn/error.
> `seaslog.hourly_distinguishing = 1` Включает создание нового файла каждые час.
> `seaslog.use_buffer = 1` Включает буфер. По умолчанию отключен. Когда это включено, логи хранятся в памяти до завершения запроса (или выхода из программы с ошибкой), после чего записываются в файл.
```> `seaslog.buffer_size = 100` Устанавливает размер буфера в 100. По умолчанию 0, то есть ограничений нет. Когда `buffer_size` больше 0, при достижении буфером этого значения, данные будут записываться в файл.> `seaslog.buffer_disabled_in_cli = 1` Включает отключение буфера при запуске в командной строке. По умолчанию отключено. Когда это включено, при запуске в командной строке будет игнорироваться настройка `seaslog.use_buffer`, и логи будут сразу записываться в файл.
> `seaslog.level = 8` Уровень записи логов. По умолчанию 8, то есть все логи будут записываться.
```markdown
> `seaslog.level = 0` записывает EMERGENCY.
> `seaslog.level = 1` записывает EMERGENCY, ALERT.
> `seaslog.level = 2` записывает EMERGENCY, ALERT, CRITICAL.
> `seaslog.level = 3` записывает EMERGENCY, ALERT, CRITICAL, ERROR.
> `seaslog.level = 4` записывает EMERGENCY, ALERT, CRITICAL, ERROR, WARNING.
> `seaslog.level = 5` записывает EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE.
> `seaslog.level = 6` записывает EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFO.
> `seaslog.level = 7` записывает EMERGENCY, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG.
seaslog.throw_exception = 1
Включает выбрасывание исключения при работе с SeasLog. Исключение будет выброшено при отсутствии прав доступа или недоступности порта сервера; если это значение выключено, исключение не будет выброшено.
seaslog.ignore_warning = 1
Включает игнорирование предупреждений при работе с SeasLog. Предупреждение будет проигнорировано при отсутствии прав доступа или недоступности порта сервера; если это значение выключено, предупреждение будет выброшено.>seaslog.trace_performance = 1
включает трассировку производительности. Пример лога производительности:
2019-01-30 11:46:53 | INFO | 91390 | 5c518ea46e010 | 1548848813.299 | {"main()":{"wt":8848,"mu":20712},"1":[{"cm":"Class0::Method0","ct":2,"wt":2007,"mu":192},{"cm":"Class1::Method1","ct":1,"wt":1002,"mu":192},{"cm":"Class2::Method2","ct":1,"wt":1001,"mu":192},{"cm":"Class3::Method3","ct":1,"wt":1000,"mu":192},{"cm":"Class4::Method4","ct":1,"wt":1000,"mu":192}],"2":[{"cm":"Class5::Method5","ct":1,"wt":1000,"mu":192}],"3":[{"cm":"Class5::Recursion","ct":1,"wt":1000,"mu":3248}],"4":[{"cm":"Class5::Recursion","ct":1,"wt":1000,"mu":2952}],"5":[{"cm":"Class5::Recursion","ct":1,"wt":1000,"mu":2656}]}
```cm => имя_функции (класс::метод)
wt => время_работы (мс)
mu => использование_памяти (байты)
ct => количество_вызовов (количество вызовов метода)
Многие пользователи обратились с просьбой предоставить возможность создания пользовательских шаблонов для логов. С версии 1.7.2 SeasLog позволяет пользователям создавать свои собственные шаблоны, при этом можно использовать множество заранее подготовленных переменных, указанных в таблице заранее подготовленных переменных.
* По умолчанию используется шаблон: `seaslog.default_template = "%T | %L | %P | %Q | %t | %M"`
* Это значит, что по умолчанию используется формат `{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}`
* Если пользователь использует другой шаблон, например: `seaslog.default_template = "[%T]:%L %P %Q %t %M"`
* То лог будет иметь следующий формат: `[ {dateTime} ]:{level} {pid} {uniqid} {timeStamp} {logInfo}`
#### Таблица предварительно установленных переменных
`SeasLog` предоставляет следующие предварительно установленные переменные, которые можно использовать непосредственно в шаблонах логов. Они будут заменены соответствующими значениями при окончательной генерации логов.
* `%L` — Уровень лога.
* `%M` — Сообщение лога.
* `%T` — Дата и время в формате `2017-08-16 19:15:02`, зависит от `seaslog.default_datetime_format`.
* `%t` — Временная метка времени в формате `1502882102.862`, с точностью до миллисекунды.
* `%Q` — ID запроса для разделения одноразовых запросов. Если метод `SeasLog::setRequestId($string)` не был вызван, используется внутренний метод `static char *get_uniqid()` для создания уникального значения при инициализации запроса.
* `%H` — Имя хоста.
* `%P` — ID процесса.
* `%D` — Область:порт, как `www.cloudwise.com:8080`; в режиме CLI это будет `cli`.
* `%R` — URI запроса, как `/app/user/signin`; в режиме CLI это будет входной файл, как `CliIndex.php`.
* `%m` — Метод запроса, как `GET`; в режиме CLI это будет исполняемая команда, как `/bin/bash`.
* `%I` — IP адрес клиента; в режиме CLI это будет `local`.Приоритет значений: HTTP_X_REAL_IP > HTTP_X_FORWARDED_FOR > REMOTE_ADDR.
* `%F` - Имя файла: номер строки, как `UserService.php:118`.
* `%U` - Использование памяти, единицы измерения — байты. Вызов `zend_memory_usage`.
* `%u` - Пиковое использование памяти, единицы измерения — байты. Вызов `zend_memory_peak_usage`.
* `%C` - Класс::Действие, как `UserService::getUserInfo`. Если используется вне класса, записывается имя функции.
* `%B` - Базовый путь, как `/var/log/www`. Зависит от `seaslog.default_basepath` и `setBasePath`.## Использование
### Константы и функции
#### Список констант
`SeasLog использует 8 уровней логирования`
##### SEASLOG_DEBUG
* "DEBUG" — отладочная информация, мелкие события
##### SEASLOG_INFO
* "INFO" — важные события, акцент на процессе работы приложения
##### SEASLOG_NOTICE
* "NOTICE" — события средней важности, более значимая информация в процессе выполнения по сравнению с INFO
##### SEASLOG_WARNING
* "WARNING" — не критическое сообщение об ошибке, потенциальная проблема, требующая внимания и исправления
##### SEASLOG_ERROR
* "ERROR" — ошибка во время выполнения, не требующая немедленного исправления, но требующая записи и анализа
##### SEASLOG_CRITICAL
* "CRITICAL" — критическая ситуация, требующая немедленного исправления, компонент программы недоступен
##### SEASLOG_ALERT
* "ALERT" — чрезвычайная ситуация, требующая немедленных действий, требуется немедленное уведомление и исправление
##### SEASLOG_EMERGENCY
* "EMERGENCY" — система недоступна
```php
var_dump(SEASLOG_DEBUG, SEASLOG_INFO, SEASLOG_NOTICE);
/*
string('DEBUG') уровень отладки
string('INFO') уровень информации
string('NOTICE') уровень уведомления
*/
SeasLog
предоставляет набор функций для удобной работы с корневыми каталогами, модульными каталогами, быстрой записью и статистикой логов.
Из следующего псевдокода вы сможете быстро получить информацию о функциях, а затем использовать их:
<?php
/**
* @author neeke@php.net
* Дата: 14-1-27 послеобеденное время 16:47
*/
define('SEASLOG_ALL', 'ALL');
define('SEASLOG_DEBUG', 'DEBUG');
``````php
define('SEASLOG_INFO', 'ИНФОРМАЦИЯ');
define('SEASLOG_NOTICE', 'УВЕДОМЛЕНИЕ');
define('SEASLOG_WARNING', 'ПРЕДУПРЕЖДЕНИЕ');
define('SEASLOG_ERROR', 'ОШИБКА');
define('SEASLOG_CRITICAL', 'КРИТИЧЕСКО');
define('SEASLOG_ALERT', 'ПОСТОРОННЕЕ');
define('SEASLOG_EMERGENCY', 'ЭМЕРГЕНС');
define('SEASLOG_DETAIL_ORDER_ASC', 1);
define('SEASLOG_DETAIL_ORDER_DESC', 2);
define('SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL', 1);
define('SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN', 2);
define('SEASLOG_REQUEST_VARIABLE_DOMAIN_PORT', 1);
define('SEASLOG_REQUEST_VARIABLE_REQUEST_URI', 2);
define('SEASLOG_REQUEST_VARIABLE_REQUEST_METHOD', 3);
define('SEASLOG_REQUEST_VARIABLE_CLIENT_IP', 4);
class SeasLog
{
public function __construct()
{
// Инициализация SeasLog
}
}
``` public function __destruct()
{
//Завершение работы SeasLog
}
/**
* Установка базового пути
*
* @param $basePath
*
* @return bool
*/
static public function setBasePath($basePath)
{
return true;
}
/**
* Получение базового пути
*
* @return string
*/
static public function getBasePath()
{
return 'the base_path';
}
/**
* Установка идентификатора текущего запроса
*
* @param string
*
* @return bool
*/
static public function setRequestID($request_id)
{
return true;
}
/**
* Получение идентификатора текущего запроса
* @return string
*/
static public function getRequestID()
{
return uniqid();
}
/**
* Установка модульной директории
*
* @param $module
*
* @return bool
*/
static public function setLogger($module)
{
return true;
}
/**
* Ручное закрытие потока logger
*
* @param $model
* @param $logger
*
* @return bool
*/
static public function closeLoggerStream($model = SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL, $logger)
{
return true;
}
/**
* Получение последней установленной модульной директории
* @return string
*/
static public function getLastLogger()
{
return 'the lastLogger';
}
/**
* Установка конфигурации DatetimeFormat
*
* @param $format
*
* @return bool
*/
static public function setDatetimeFormat($format)
{
return true;
}
/**
* Возврат текущей конфигурации DatetimeFormat
* @return string
*/
static public function getDatetimeFormat()
{
return 'the datetimeFormat';
}
/**
* Установка переменной запроса
*
* @param $key
* @param $value
*
* @return bool
*/
static public function setRequestVariable($key, $value)
{
return true;
}```php
/**
* Получение переменной запроса
*
* @param $key
*
* @return string
*/
static public function getRequestVariable($key)
{
return '';
}
}
```
```markdown
/**
* Подсчитывает количество всех типов строк (или строк одного типа)
*
* @param string $level
* @param string $log_path
* @param null $key_word
*
* @return array | long
*/
static public function analyzerCount($level = 'all', $log_path = '*', $key_word = null)
{
return array();
}
```
```php
/**
* Возвращает детали логов указанного типа в виде массива
*
* @param $level
* @param string $log_path
* @param null $key_word
* @param int $start
* @param int $limit
* @param $order
*
* @return array
*/
static public function analyzerDetail($level = SEASLOG_INFO, $log_path = '*', $key_word = null, $start = 1, $limit = 20, $order = SEASLOG_DETAIL_ORDER_ASC)
{
return array();
}
/**
* Получает содержимое буфера текущего лога
*
* @return array
*/
static public function getBuffer()
{
return array();
}
/**
* Проверяет, включен ли буфер
*
* @return bool
*/
static public function getBufferEnabled()
{
return true;
}
/**
* Получает количество записей в буфере
*
* @return int
*/
static public function getBufferCount()
{
return 0;
}
/**
* Сохраняет содержимое буфера на диск
*
* @return bool
*/
static public function flushBuffer()
{
return true;
}
/**
* Записывает сообщение отладочного уровня
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function debug($message, array $context = array(), $module = '')
{
#$level = SEASLOG_DEBUG
}
``` /**
* Записывает сообщение информационного уровня
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function info($message, array $context = [], $module = '')
{
#$level = SEASLOG_INFO
} /**
* Записывает сообщение уровня уведомления
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function notice($message, array $context = [], $module = '')
{
#$level = SEASLOG_NOTICE;
}
/**
* Записывает сообщение уровня предупреждения
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function warning($message, array $context = [], $module = '')
{
#$level = SEASLOG_WARNING;
}
/**
* Записывает лог ошибки
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function error($message, array $context = [], $module = '')
{
#$level = SEASLOG_ERROR;
}
/**
* Записывает критический лог
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function critical($message, array $context = [], $module = '')
{
#$level = SEASLOG_CRITICAL;
}
/**
* Записывает лог тревоги
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function alert($message, array $context = [], $module = '')
{
#$level = SEASLOG_ALERT;
}
/**
* Записывает лог чрезвычайной ситуации
*
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function emergency($message, array $context = [], $module = '')
{
#$level = SEASLOG_EMERGENCY;
}
/**
* Общие методы работы с логами
*
* @param $level
* @param string|array $message
* @param array $context
* @param string $module
*/
static public function log($level, $message, array $context = [], $module = '')
{ }
}
### PHP Re Результат
[SeasLog_PHP_Re_Результат](https://github.com/SeasX/SeasLog/blob/master/Specification/SeasLog_PHP_Re_Результат.md)
### Использование SeasLog Logger
#### Получение и установка basePath
```php
$basePath_1 = SeasLog::getBasePath();
SeasLog::setBasePath('/log/base_test');
$basePath_2 = SeasLog::getBasePath();
var_dump($basePath_1,$basePath_2);
/*
string(19) "/log/seaslog-ciogao"
string(14) "/log/base_test"
*/
```
> Прямое использование `SeasLog::getBasePath()`, вернёт значение `seaslog.default_basepath` из php.ini (seaslog.ini).
> Использование функции `SeasLog::setBasePath()` изменяет значение, возвращаемое `SeasLog::getBasePath()`.
#### Установка logger и получение последнего logger
```php
$lastLogger_1 = SeasLog::getLastLogger();
SeasLog::setLogger('testModule/app1');
$lastLogger_2 = SeasLog::getLastLogger();
```
```php
var_dump($lastLogger_1,$lastLogger_2);
/*
string(7) "default"
string(15) "testModule/app1"
*/
```
> Аналогично базовой директории,
> можно использовать `SeasLog::getLastLogger()`, чтобы получить значение `seaslog.default_logger` из конфигурационного файла php.ini (seaslog.ini).
> Используйте функцию `SeasLog::setLogger()`, чтобы изменить значение, возвращаемое `SeasLog::getLastLogger()`.
#### Быстрая запись лога
Базовая директория и logger уже были установлены, поэтому папка для записи логов создана,
> путь к логу = basePath / logger / {fileName}.log
где имя файла формируется по шаблону года-месяца-дня, например, если сегодня 18 февраля 2014 года, то `{fileName}` будет равно `20140218`.
Помните ли вы параметр `seaslog.disting_type` в вашем php.ini?
По умолчанию `seaslog.disting_type = 0`. В этом случае, если вы используете `SeasLog` сегодня, будет создан следующий лог-файл:
* LogFile = basePath / logger / 20140218.logЕсли же `seaslog.disting_type = 1`, то будут созданы три отдельных файла:
* infoLogFile = basePath / logger / 20140218.INFO.log
* warnLogFile = basePath / logger / 20140218.WARNING.log
* erroLogFile = basePath / logger / 20140218.ERROR.log
Функции для записи логов имеют два прототипа:
* SeasLog::log($level, $messages[, $context, $logger])
* SeasLog::$level($messages[, $context, $logger])
> $level - смотрите вышеупомянутые 8 уровней
> $messages - может быть типа `string` или `array`, массив допускается только одномерный
> $context - допускается только одномерный массив, используется для замены плейсхолдеров в $messages
> $logger - временно указывает logger для текущего действия, не меняя значение getLastLogger()
```php
SeasLog::log(SEASLOG_ERROR,'this is a error test by ::log');
SeasLog::debug('this is a {userName} debug',array('{userName}' => 'neeke'));
SeasLog::info('this is a info log');
SeasLog::notice('this is a notice log');
SeasLog::warning('your {website} was down, please {action} it ASAP!',array('{website}' => 'github.com','{action}' => 'rboot'));
SeasLog::error('a error log');
SeasLog::critical('something was critical');
SeasLog::alert('yes this is a {messageName}',array('{messageName}' => 'alertMSG'));
SeasLog::emergency('Just now, the house next door was completely burnt out! {note}',array('{note}' => 'it`s a joke'));
```
```php
$aMessages = array('тестовый лог с массива abc {website}','тестовый лог с массива def {action}');
$aContent = array('website' => 'github.com','action' => 'rboot');
SeasLog::debug($aMessages,$aContent);
/*
Эти функции также принимают третий параметр в виде настроек логгера.
Обратите внимание, что когда last_logger == 'default', это эквивалентно:
SeasLog::setLogger('test/new/path');
SeasLog::error('test error 3');
Если метод SeasLog::setLogger() уже был использован ранее, то третий параметр будет временным и не повлияет на последующие вызовы.
*/
``````markdown
> Формат лога зависит от `seaslog.default_template`.
> По умолчанию значение `seaslog.default_template` равно `seaslog.default_template = "%T | %L | %P | %Q | %t | %M"`.
> В этом случае лог имеет следующий формат: `{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}`.
> Подробнее о создании пользовательских шаблонов и значениях по умолчанию в SeasLog можно узнать в разделе [Создание пользовательского шаблона лога](#создание-пользовательского-шаблона-лога).
```
```sh
2014-07-27 08:53:52 | ОШИБКА | 23625 | 599159975a9ff | 1406422432.786 | это тестовое сообщение об ошибке через лог
2014-07-27 08:53:52 | ОБСЛУЖИВАНИЕ | 23625 | 599159975a9ff | 1406422432.786 | это тестовое сообщение для отладки
2014-07-27 08:53:52 | ИНФО | 23625 | 599159975a9ff | 1406422432.787 | это информационное сообщение
2014-07-27 08:53:52 | УВЕДОМЛЕНИЕ | 23625 | 599159975a9ff | 1406422432.787 | это уведомление
2014-07-27 08:53:52 | ПРЕДУПРЕЖДЕНИЕ | 23625 | 599159975a9ff | 1406422432.787 | ваш github.com недоступен, пожалуйста перезапустите его как можно скорее!
2014-07-27 08:53:52 | ОШИБКА | 23625 | 599159975a9ff | 1406422432.787 | тестовое сообщение об ошибке
2014-07-27 08:53:52 | КРИТИЧЕСКИЙ | 23625 | 599159975a9ff | 1406422432.787 | что-то критическое произошло
2014-07-27 08:53:52 | ЭМЕРГЕНЦИЯ | 23625 | 599159975a9ff | 1406422432.787 | Только что дом напротив полностью выгорел! Это шутка
2014-07-27 08:53:52 | ОБСЛУЖИВАНИЕ | 23625 | 599159975a9ff | 1406422432.787 | тестовый лог с массива abc github.com
2014-07-27 08:53:52 | ОБСЛУЖИВАНИЕ | 23625 | 599159975a9ff | 1406422432.787 | тестовый лог с массива def rboot
```
#### Формат данных при отправке через TCP или UDP
Когда `seaslog.`аппендер` настроен на значение `2 (TCP)` или `3 (UDP)`, логи будут отправлены на TCP или UDP порт `remote_host:remote_port`.> При отправке логов в удаленное место, SeasLog следует стандарту [RFC5424](http://www.faqs.org/rfcs/rfc5424.html).
> Формат лога стандартизирован как: `<PRI>1 {timeStampWithRFC3339} {HostName} {loggerName}[{pid}]: {logInfo}`
> В данном случае `{logInfo}` зависит от конфигурации `seaslog.default_template`.
```sh
Пример отправляемого формата:
<15>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | DEBUG | 21423 | 599157af4e937 | 1466787583.322 | Это пример отладочного сообщения neeke
<14>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | INFO | 21423 | 599157af4e937 | 1466787583.323 | Это пример информационного сообщения
<13>1 2017-08-27T01:24:59+08:00 vagrant-ubuntu-trusty test/logger[27171]: 2016-06-25 00:59:43 | NOTICE | 21423 | 599157af4e937 | 1466787583.324 | Это пример сообщения уровня "notice"
```
#### Ручное освобождение кэша LoggerStream
`SeasLog` кэширует дескрипторы потока для активированных логгеров, чтобы снизить затраты на создание потока. Дескрипторы автоматически освобождаются после завершения запроса.
Если процесс завершается в режиме CLI, дескрипторы также будут автоматически освобождены. Либо вы можете использовать следующие функции для ручного освобождения (функции для ручного освобождения требуют версию SeasLog 1.8.6 или выше).
> Ручное закрытие всех дескрипторов LoggerStream:
```php
SeasLog::closeLoggerStream();
или
SeasLog::closeLoggerStream(SEASLOG_CLOSE_LOGGER_STREAM_MOD_ALL);
```
> Ручное закрытие дескриптора конкретного LoggerStream:
```php
SeasLog::closeLoggerStream(SEASLOG_CLOSE_LOGGER_STREAM_MOD_ASSIGN, 'logger_name');
```### Использование анализатора SeasLog
#### Быстрое получение количества записей определённого типа лога
`SeasLog` использует расширение для вызова командной строки `grep -wc` для быстрого получения значения count и возврата его в PHP (массив или целое число).
```php
$countResult_1 = SeasLog::analyzerCount();
$countResult_2 = SeasLog::analyzerCount(SEASLOG_WARNING);
$countResult_3 = SeasLog::analyzerCount(SEASLOG_ERROR, date('Ymd', time()));
var_dump($countResult_1, $countResult_2, $countResult_3);
/*
array(8) {
["DEBUG"]=>
int(3)
["INFO"]=>
int(3)
["NOTICE"]=>
int(3)
["WARNING"]=>
int(3)
["ERROR"]=>
int(6)
["CRITICAL"]=>
int(3)
["ALERT"]=>
int(3)
["EMERGENCY"]=>
int(3)
}
*/
```
## Получение списка логов определённого типа
`SeasLog` использует трубу для вызова командной строки `grep -w`, чтобы быстро получить список и вернуть его в виде массива PHP.
```php
$detailErrorArray_inAll = SeasLog::analyzerDetail(SEASLOG_ERROR);
$detailErrorArray_today = SeasLog::analyzerDetail(SEASLOG_ERROR, date('Ymd', time()));
var_dump($detailErrorArray_inAll, $detailErrorArray_today);
/*
SeasLog::analyzerDetail(SEASLOG_ERROR) == SeasLog::analyzerDetail(SEASLOG_ERROR, '*');
Получает список всех записей уровня SEASLOG_ERROR для текущего модуля:
array(6) {
[0] => string(66) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | test error 3"
[1] => string(66) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | test error 3"
[2] => string(66) "2014-02-24 00:14:04 | ERROR | 8620 | 1502697015147 | 1393172044.862 | test error 3"
[3] => string(66) "2014-02-24 00:14:05 | ERROR | 8646 | 599159975a9ff | 1393172045.989 | test error 3"
[4] => string(66) "2014-02-24 00:14:07 | ERROR | 8672 | 599159986ec28 | 1393172047.882 | test error 3"
[5] => string(66) "2014-02-24 00:14:08 | ERROR | 8698 | 5991599981cec | 1393172048.736 | test error 3"
}
*/SeasLog::analyzerDetail(SEASLOG_ERROR, date('Ymd', time()));
Получает список всех записей уровня SEASLOG_ERROR за сегодняшний день для текущего модуля:
array(2) {
[0] => string(66) "2014-02-24 00:14:02 | ERROR | 8568 | 599157af4e937 | 1393172042.717 | тестовое сообщение об ошибке 3"
[1] => string(66) "2014-02-24 00:14:04 | ERROR | 8594 | 5991576584446 | 1393172044.104 | тестовое сообщение об ошибке 3"
}
Аналогично можно получить список за месяц:
$detailErrorArray_month = SeasLog::analyzerDetail(SEASLOG_ERROR, date('Ym', time()));
*/
### Конфигурация предупреждений с использованием SeasLog
#### Настройка предупреждений
```ini
[Основные]
Ожидаемый_путь_анализируемого_лога = /log/основной_тест
[Вилка]
; Открыть многопоточность? 1 - да, 0 - нет
Многопоточность_открыта = 1
; Количество потоков
Количество_потоков = 3
[Предупреждение]
Почта[SMTP_Сервер] = smtp.163.com
Почта[SMTP_Порт] = 25
; Включить шифрование? TLS SSL, пустое значение - отключение
Почта[SMTP_Защита] =
; Тип отправки почты SMTP, SENDMAIL, MAIL
; SMTP: реализация SMTP протокола в PHP
; SENDMAIL: требуется конфигурация php.ini для sendmail_path
; MAIL: использование встроенной функции mail()
Почта[SMTP_Отправитель] = smtp
Почта[Тема_предварительная] = Предупреждающее сообщение -
Почта[SMTP_Пользователь] = seaslogdemo@163.com
Почта[SMTP_Пароль] = seaslog#demo
Почта[Отправитель_Почты] = seaslogdemo@163.com
Почта[Адресат_Почты] = gaochitao@weiboyi.com
Почта[Копия_Почты] = ciogao@gmail.com
Почта[Скрытая_Копия_Почты] =
```
```[Анализ]
; перечисление
; SEASLOG_DEBUG "DEBUG"
; SEASLOG_INFO "INFO"
; SEASLOG_NOTICE "NOTICE"
; SEASLOG_WARNING "WARNING"
; SEASLOG_ERROR "ERROR"
; SEASLOG_CRITICAL "CRITICAL"
; SEASLOG_ALERT "ALERT"
; SEASLOG_EMERGENCY "EMERGENCY"
```; позволяет отдельно мониторить различные модули с определённым уровнем логов и отправлять их на разные электронные адреса
; задача тест1 представляет собой
; считает количество логов уровня SEASLOG_ERROR в модуле test, если это число превышает 3, то отправляет сообщение об ошибке на gaochitao@weiboyi.com
test1[модуль] = test
test1[уровень] = SEASLOG_ERROR
test1[бар] = 3
test1[почта_кому] = neeke@php.net
test2[модуль] = 222
test2[уровень] = SEASLOG_WARNING
test2[почта_кому] = neeke@php.net,ciogao@gmail.com
test3[модуль] = 333
test3[уровень] = SEASLOG_CRITICAL
test4[модуль] = 444
test4[уровень] = SEASLOG_EMERGENCY
test5[модуль] = 555
test5[уровень] = SEASLOG_DEBUG
```
#### конфигурация cron
```conf
; выполняется каждый день в 3 часа ночи
0 3 * * * /путь/к/php /путь/к/SeasLog/Analyzer/SeasLogAnalyzer.php
```
## Клиенты, использующие SeasLog
### Список компаний
- CloudWise [www.cloudwise.com](http://www.cloudwise.com/)
- AutoNavi (часть проектов)
- Tencent (часть проектов)
- Formax [www.jrq.com](http://www.jrq.com/)
- Chongqing YiPeng Technology (наибольший независимый платформа для животных в Китае) [www.epet.com](http://www.epet.com/)
- Weifucai [www.weicaifu.com](http://www.weicaifu.com/)
- MeiLiShuo (часть проектов) [www.meilishuo.com](http://www.meilishuo.com/)
- Baidu Crab Platform [crab.baidu.com](http://crab.baidu.com/)
- AiPet Doctor (наибольшая интернет-платформа для ветеринарной помощи в Китае) [www.5ichong.com](http://www.5ichong.com/)
- iQIYI Showroom (платформа стриминга красоток) [x.pps.tv](http://x.pps.tv/)
- и другие...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )