Задать вопрос
@bestauction

Как хранить логи приложения на php?

Привет.

TLDR: Мне хочется хранить в чем то именно свои логи, кастомные, а не собирать всё подряд в одну кучу. Текущее решение с хранением в MySql не устраивает

Уже существует несколько сервисов на Laravel/Lumen, где есть некоторые внутренние логи (действия пользователей, денежные операции, обработка вебхуков и тд). Сейчас эти логи хранятся по таблицамв мускуле, каждому типу логов своя таблица: например таблица http логов входящие и исходящие, таблица входящих вебхуков и тд. Эти таблицы очень быстро заполняются, запросы по ним тяжелые, полнотекстовый поиск такая себе идея.

Эти логи используются по большей части разработчиками для поиска и отладки багов: посмотреть какой запрос куда ушел/пришел, какое то логирование выполнения крон команд (не только сам факт запуска/остановки скрипта, но и какие то промежуточные действия, например логируется процесс выполнения)

Читал про такие системы как ELK/EFK, PLG. Сложилось впечатление что ими собирают в основном логи nginx (все входящие запросы). Либо второй вариант: пишут в коде нечто вроде echo *log*, и при этом перенапрявляют весь вывод в stdout, а дальше докер это всё прокидывает куда то там (не разбирался).

Первый вариант меня не устраивает (или я не понимаю как это организовать), тем что все логи будут храниться как то в куче, их нужно будет уже на стороне того же PLG как то группировать на основе какого нибудь id, который пришел скажем в заголовке.
Пример: залогировать переход юзера на страницу, а в запросе будет только его кука (условно) для идентификации. Не подходит

Второй вариант вроде более детальный, можно самому формировать строку лога, но тогда надо строить какую то свой формат вывода, чтобы например отличать что этот лог от юзеров, этот лог от фин. операций и тд. Хотя в первом пункте такое тоже нужно....

В начале читал даже про ClickHouse, но понял что он вроде как не для этого.

Подскажите как организовывают хранение логов в больших проектах? Где можно прочитать про лучшие практики?

P.S. можно конечно и дальше возиться с таблицей в бд, к ней прикрутить Elasticsearch и индексировать эти логи, настраивать какую то ротацию. Но мне кажется это не верный вариант
  • Вопрос задан
  • 649 просмотров
Подписаться 2 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 4
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Собираем логи Symfony в Elasticsearch с помощью Filebeat и Monolog
Ответ написан
Комментировать
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Sentry, Elasticsearch+Logstash+Kibana. Больше особо нечего сказать)

Для PHP есть библиотека Monolog, которая умеет легировать в разные источники.
Ответ написан
Adamos
@Adamos
Альтернатива БД, если лог именно и только для разработчика.
class Logger
{
	private $logfile;
	private function __construct()
	{}
	public function __destruct()
	{
		$this->log('');
		fclose($this->logfile);
	}
	public function log($string)
	{
		fwrite($this->logfile, $string . "\n");
		fflush($this->logfile);
	}
    static public function getCommon($tag)
    {
        $logDir = base_path() . '/../logs/' . $tag; // это в Ларавели, без нее $_SERVER['DOCUMENT_ROOT'] или абсолютный путь (если должно работать в консоли/кроне)
        if(!file_exists($logDir)) {
            mkdir($logDir);
        }
        $logger = new Logger();
        $logger->logfile = fopen($logDir . '/' . date('Y-m-d') . '.log', 'at');
        $logger->log(date('Y-m-d H:i:s') . "\n");
        return $logger;
    }
}

Выше корня проекта - папка logs, в ней по подпапкам (определяется в конструкторе логгера) разложены логи того, что происходит. Имя файла сегодняшнего лога - текущая дата, так что легко настраивается чистка по крону и элементарно ищется информация за нужный день.
Да, это колхоз, нестандарт и животноводство. Но пользоваться этим удобно. Во всяком случае, мне.
Ответ написан
@rPman
Храни в sql базе, так как это временные логи, используй партиционирование, и очень хорошо думай какие индексы ставить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы