1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/neeke-SeasLog

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh.md 51 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 16.03.2025 09:50 b87c74e

SeasLog

Статус сборки Статус сборки

Эффективное, быстрое и стабильное расширение для логирования в PHP

@Autowired Чито Гао [neeke@php.net]

@Общение 312910117

Руководство по PHP

Документация на английском

Нормы логирования

Сборка логов> ---

Введение

Почему использовать SeasLog

Логи обычно являются записями работы системы или программного обеспечения. Анализ логов позволяет пользователям легко понять состояние работы системы или программы; если логи достаточно подробны, можно анализировать поведение пользователей в прошлом, типы действий, географическое распределение или другие данные. Если логи также разделены на различные уровни, это значительно облегчает анализ состояния здоровья приложения, своевременное выявление проблем и быстрое решение.PHP имеет встроенные функции error_log и syslog, которые мощны и эффективны, но имеют множество недостатков (например, отсутствие уровня ошибок в error_log, отсутствие фиксированной формы записи, отсутствие модульности в syslog и смешивание с системными журналами), что снижает их гибкость и делает их непригодными для многих приложений.

К счастью, существуют несколько сторонних библиотек для логирования, таких как log4php, plog, Analog и другие (включая многие проекты, где логи были созданы самостоятельно). Из них наиболее известна log4php, которая отличается высокой качественной разработкой, идеальным форматом, полной документацией и мощными возможностями. Рекомендую.

Однако log4php демонстрирует очень плохие показатели производительности. Ниже приведена сравнительная тестовая диаграмма производительности SealLog против log4php (тестовое окружение: Ubuntu 12.04, процессор Intel i3, память 16 ГБ, жесткий диск SATA 7200 rpm): SeasLogVSlog4php

Так или иначе, существует ли библиотека для логирования, удовлетворяющая следующим требованиям?

  • Разделение на модули и уровни
  • Простая конфигурация (лучше всего — без необходимости конфигурации)
  • Ясный и читаемый формат логов
  • Простое использование и отличная производительностьSeasLog был создан именно для удовлетворения этих требований.

Что доступно сейчас

  • Быстрая и стандартизованная регистрация логов в PHP-проектах
  • Конфигурируемые по умолчанию каталоги логов и модули
  • Указание каталога логов и получение текущего конфигурационного файла
  • Начальный аналитический и предупреждающий фреймворк
  • Эффективное буферизирование логов и удобство отладки буферизации
  • Соответствие стандарту PSR-3 для логов
  • Автоматическая регистрация информации об ошибках
  • Автоматическая регистрация информации об исключениях
  • Подключение к TCP-порту для отправки логов в формате RFC5424
  • Подключение к UDP-порту для отправки логов в формате RFC5424
  • Поддержка идентификатора запроса для различения между запросами
  • Поддержка пользовательских шаблонов логов

Какова цель

  • Лёгкая и стандартизированная регистрация логов
  • Высокопроизводительный анализ больших объёмов данных логов
  • Конфигурируемые и многоканальные предупреждения логов

Установка

Компиляция и установка SeasLog

$ /path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
$ make && make install

Установка SeasLog с помощью PECL

$ pecl install seaslog

Использование SeasLog в окружении Windows

Перейдите на страницу 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/neeke-SeasLog.git
git@api.gitlife.ru:oschina-mirror/neeke-SeasLog.git
oschina-mirror
neeke-SeasLog
neeke-SeasLog
master