php записать лог в файл

Логирование всех POST и GET запросов

php записать лог в файл. Смотреть фото php записать лог в файл. Смотреть картинку php записать лог в файл. Картинка про php записать лог в файл. Фото php записать лог в файл

Простой способ вести логи средствами php. Статья рассчитана для новичков в программировании.
Бывают ситуации, когда необходимо посмотреть входящие запросы ко всем файлам CMS, либо к файлам в отдельно взятой директории. При большом числе посетителей сайта, анализ файлов access.log становится затруднительным.

Представленный ниже пример отлично справляется с этой задачей. Данный способ ведения логов рекомендуется использовать «здесь и сейчас», непосредственно на время отладки. В отличие от стандартного способа, предлагаемого любым нормальным хостинг-провайдером, в данном примере не предусмотрена очистка логов, а по сему его стоит использовать кратковременно, во избежание разрастания файлов post.log и get.log. Данный модуль позволяет записывать лог всех POST и GET запросов к php файлам в выбранной папке (включая вложенные папки).

1. Для начала создаём в корне сайта папку modules, в которой в свою очередь создаём папку log.

2. В ней создадим 2 файла. Назовём их post.log и get.log. В них мы будем записывать логи POST и GET запросов соответственно.

3. В этой же папке создадим файл save_log.php со следующим содержимым:

Кратко разберем данный файл. Используя суперглобальный массив $_SERVER, определяем путь к корневой директории сервера. Затем, используя конкатенацию, получаем полный путь к файлам get.log и post.log. В итоге в переменной $file_get получаем путь вида: «/home/site/public_html/modules/log/get.log«.

Затем, в зависимости от типа запроса, открываем файл post.log, либо get.log, с параметром «a«. Благодаря данному параметру, при каждой последующей записи, указатель перемещается в конец файла. Таким образом, в отличие от параметра «w«, при добавлении новых записей, старые не удаляются.

При помощи функции var_export, записываем информацию о POST, либо GET запросе. Не забываем закрыть файл при помощи функции fclose.

Отлично. Теперь все POST и GET запросы, приходящие на файл save_log.php, бережно сохраняются. Но как же сохранить запросы к другим файлам?

4. Для этого воспользуемся файлом .htaccess. Его необходимо создать в директории, для которой нужно вести логи. В качестве примера используем файл .htaccess, находящийся в корневой папке сайта. Допишем в начало файла следующую строчку:

Где /home/site/public_html/ — путь до корневой папки сайта.

Источник

PHP — запись в лог файл или логирование

Используем простую запись в файл для отладочной информации, а также смотрим для чего еще можно использовать file_put_contents.

Как при помощи PHP записывать отладочную информацию в файл?

Используем вышеупомянутый file_put_contents:

Немного улучшим код и рассмотрим как он будет выглядеть:

Какие есть особенности?
Во-первых — лог файл запишется в ту же папку, где и ваш скрипт.
Во-вторых — запись может быть невозможна, если вы не дали файлу достаточно прав.
В-третьих — контролируйте размер файла, или обнуляйте запись. Чтобы это сделать нужно убрать FILE_APPEND:

Как можно использовать запись в файл на PHP?

Помимо этого, вы можете сохранять текущий шаг большой выгрузки, запись такая же как и с лог файлом (без FILE_APPEND).
В файле просто хранится цифра. Можно хранить шаг либо в GET параметре, либо в БД — вариантов на самом деле очень много 🙂

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

— Создание сайтов на 1С-Битрикс любой сложности
— Вёрстка макетов Figma, Photoshop, Zeplin
— Поддержка проектов на Битриксе
— Разработка нового функционала для сайта
— Парсинг данных
— Выгрузка из файлов в формате XML, YML, XLS, XLSX, CSV, JSON
— Интеграция по API со сторонними сервисами
и многое другое

Источник

Логирование в распределенном php-приложении

php записать лог в файл. Смотреть фото php записать лог в файл. Смотреть картинку php записать лог в файл. Картинка про php записать лог в файл. Фото php записать лог в файл

В статье пойдет речь о том, какую пользу оказывает логирование. Расскажу о логах по PSR. Добавлю немного личных рекомендаций по работе с уровнем, сообщением и контекстом логируемого события. Будет приведен пример, как можно организовать логирование и мониторинг с помощью ELK в приложении, написанном на Laravel и запущенном через Docker на нескольких инстансах. Распишу важное правило системы оповещения. Приведу пример скрипта, который поднимает одной командой весь стек мониторинга.

Польза логирования

Хорошо организованное логирование позволяет, как минимум, следующее:

Сама по себе запись в лог вам всего этого не скажет, но с помощью логов будет возможность самостоятельно узнать подробности событий, либо настроить систему мониторинга логов, которая будет иметь возможность оповещать о проблемах. Если сообщения в логах сопровождаются достаточным объемом контекста, то это значительно упрощает отладку, потому что вам будет доступно больше данных о ситуации, в которой произошло событие.

Чем писать и что писать

Частью php-сообщества разработаны рекомендации по некоторым задачам написания кода. Одна из таких рекомендаций PSR-3 Logger Interface. Она как раз описывает то, чем нужно логировать. Для этого разработан интерфейс Psr\Log\LoggerInterface пакета «psr/log». При его использовании нужно знать о трёх составляющих события:

Уровни события по PSR-3

Уровни заимствованы из RFC 5424 — The Syslog Protocol, примерное описание их следующее:

Описание есть, но следовать им не всегда получается легко, из-за сложности определения важности некоторых событий. Например, в контексте одного запроса не удалось выполнить обращение к подключаемому ресурсу. При записи этого события мы не знаем, один ли такой запрос завершился неудачей, а может только у одного пользователя такие запросы завершаются неудачей. От этого зависит, требуется безотлагательное вмешательство или это редкий случай, может подождать или даже его можно проигнорировать. Такие вопросы решаются в рамках мониторинга логов. Но уровень определить всё равно надо. Поэтому об уровнях логирования в команде можно договориться. Пример:

Сообщение события

Контекст события

В Laravel можно для событий автоматически вписывать в контекст данные. Это можно сделать через Global Log Context (только для непойманных исключений или через report() ), либо через LogFormatter (для всех событий). Обычно, добавляется информация с id текущего пользователя, request URI, IP, request UUID и подобное.

При использовании Elasticsearch в качестве хранилища логов следует помнить, что в нём используются фиксированные типы данных. То есть, если вы передавали в контексте customer_id числом, то при попытке сохранить событие с другим типом, например строкой (uuid), то такое сообщение не запишется. Типы в индексе фиксируются при первом получении значения. Если индексы создаются каждый день, то новый тип запишется только на следующий день. Но даже это не избавит от всех проблем, потому что для Kibana типы будут смешанными и часть операций, привязанных к типу, будет недоступна пока будут смешанные индексы.

Для предотвращения этой проблемы рекомендую придерживаться правил:

Вызов логгера из кода

Для быстрой записи события в лог можно придумать несколько вариантов. Рассмотрим некоторые из них.

Где в коде вызывать логгер

При организации кода в проекте может возникнуть вопрос, в каком классе мне следует писать в лог. Должен ли это быть сервис? Или это нужно делать там, откуда сервис вызываем: контроллер, фоновая задача, консольная команда? Или каждое исключение само должно решать, что ему писать в лог с помощью его метода report (Laravel)? Простого ответа сразу на все вопросы нет.

Может показаться, что мы всегда можем логировать только в сервисах. Действительно, в некоторых сервисах можно сделать логирование. Но рассмотрим сервис, который не зависит от проекта и, вообще, мы планируем вынести его в отдельный пакет. Тогда этот сервис не знает о своей важности в проекте, а, значит, не сможет определить уровень логирования. Например, сервис интеграции с конкретным SMS-шлюзом. Если мы получили сетевую ошибку, то это ещё не значит, что она достаточно серьезная. Возможно, в системе есть сервис интеграции с другим SMS-шлюзом, через который будет вторая попытка отправки, тогда ошибку от первого можно репортить как warning, а ошибку второго как error. Только вот все эти интеграции должны быть вызваны из другого сервиса, который как раз и будет логировать. Получается, что ошибка в одном сервисе, а логируем в другом. Но иногда у нас нет сервиса-обёртки над другим сервисом — мы вызываем сразу из контроллера. В этом случае я считаю допустимым писать в лог в контроллере вместо того, чтобы писать сервис-декоратор для логирования.

Пример, показывающий использование зависимости и передачу контекста:

Куда писать

Рассмотрим следующие варианты.

* В php-fpm 7.2 при записи логов в stdout получаем «WARNING: [pool www] child X said into stdout. «, и длинные сообщения обрезаются. Одно из решений этой проблемы здесь. В php-fpm 7.3 такой проблемы нет.

Варианты формата записи:

Любой из вариантов предполагает, что логи подвергаются маршрутизации — как минимум, отправке в единую систему обработки (хранения) логов по следующим причинам:

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

Использование Filebeat + ELK + Elastalert

Кратко роль каждого сервиса можно описать так:

Дополнительно можно: zabbix, metricbeat, grafana и прочее.

Теперь подробнее о каждом.

Filebeat

Logstash

Умеет принимать события от многих источников, но здесь мы рассматриваем Filebeat.
В каждом событии кроме самого события из stdout/stderr есть метаданные (хост, контейнер и т. п.). Много встроенных фильтров обработки: парсить по регуляркам, разбирать json, изменять, добавлять, удалять поля и т. п. Подходит для парсинга как логов приложения, так и nginx access.log в произвольном формате. Умеет передавать данные в разные хранилища, но здесь рассматриваем Elasticsearch.

Elasticsearch

Elasticsearch очень мощный инструмент для большого спектра задач, но с целью мониторинга логов его можно использовать зная лишь некоторый минимум.
Сохраненные события — это документ, документы хранятся в индексах.
Каждый индекс — это схема, в которой определен тип для каждого поля документа. Нельзя сохранить событие в индексе, если хотя бы у одного поля неподходящий тип.
Разные типы позволяют делать разные операции над группой документов (для чисел — sum, min, max, avg и т. п., для строк — нечеткий поиск и так далее).
Для логов руководства обычно рекомендуют использовать дневные индексы — каждый день новый индекс.

Обеспечение стабильной работы Elasticsearch с ростом объема данных — задача, требующая более глубоких знаний об этом инструменте. Но быстрым решением проблемы стабильности можно выбрать автоматическое удаление устаревших данных. Для этого я предлагаю разбивать в logstash уровни событий по разным индексам. Это позволит дольше хранить редкие, но более важные события.

Для автоматического удаления устаревших индексов предлагаю использовать программу от Elastic Curator. Запуск программы добавляется в расписание Cron, сама конфигурация может храниться в отдельном файле.

Для долговечного хранения событий предлагаю использовать альтернативные системы хранения, которые могут быть подключены как сервисы приёма от Filebeat или Logstash, либо полностью отдельно. В недавних версиях Elasticsearch ввели разбиение на горячие-теплые-холодные индексы, возможно, их следует вам рассмотреть.

Kibana

Kibana здесь используется как инструмент для чтения журнала событий. Это веб-приложение, которое выполняет запросы к Elasticsearch. Позволяет строить дашборды с разными визуализациями показателей.

Типичное использование Kibana — это ежедневный просмотр списка недавних событий в разделе Discovery с некоторыми фильтрами. Например, отдельная страница Discovery с отображением списка недавних событий из app с уровнем warning и выше, где выводятся столбцы time, message, exception class, host, client_id.

Другой пример, страница Discovery с отображением списка недавних событий из nginx, у которых неуспешные статусы и не 404 с отображением столбцов time, message, request, status.
Кроме того Kibana используется для дебага, так как в ней можно быстро отфильтровать события: по сообщению, по уровню, по любому значению из контекста. Например, выбрать все события по конкретному клиенту (делается в один клик по одному событию нужного клиента).

php записать лог в файл. Смотреть фото php записать лог в файл. Смотреть картинку php записать лог в файл. Картинка про php записать лог в файл. Фото php записать лог в файл

Elastalert

Elastalert используется для выполнения запросов к Elasticsearch и оповещению на основе их результатов. Другими словами, алертинг. Есть широкий набор типов правил, с помощью которых можно построить эффективную систему оповещения об отклонениях.
Для каждого правила можно указать расписание запуска, интервал для повторной отправки по тому же условию (реалерт), список сервисов для оповещения и многое другое.

Некоторые примеры правил:

При подключении автоматических оповещений о событиях следует не допустить очень серьезную ошибку — слишком частое оповещение. Я рекомендую настраивать автоматическое оповещение таким образом, чтобы уведомления шли только по событиям, требующим безотлагательного вмешательства. Всё остальное нужно привыкать смотреть самостоятельно используя Kibana.

Если вы настроили правило, например, что успешных http-кодов должно быть не менее 75% за час, затем получили оповещение об отклонении, проверили и обнаружили, что ничего страшного не произошло, то правило нужно менять. Если какое-то правило постоянно срабатывает, но ничего критичного не происходит, и уже нечего менять в правиле, то лучше его отключить совсем.

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

Рекомендую границу в 5 уведомлений в неделю в среднем. Если их получается больше, значит, это уже не внезапные отклонения, а ожидаемые, а значит, уведомления по ним не нужны.

Я уделил особое внимание частоте оповещений, потому что нарушение этого правила приводит к полному игнорированию оповещений. Это сводит пользу автоматических уведомлений на нет.

При получении оповещения хорошей привычкой может стать обзор ситуации через просмотр Kibana по всем недавним событиям. Это позволит точнее оценить ситуацию и корректно расставить приоритеты при решении проблемы.

Всё вместе

Всё описанное можно запускать в docker-контейнерах. Причём всё конфигурируется таким образом, что всем стеком можно пользоваться как локально при разработке, так и в staging- и production-окружениях, где переменными остаются только переменные окружения.

Все описанные сервисы, за исключением Elastalert, позволяют использовать переменные окружения в конфигурациях. Проблему Elastalert удалось разрешить, используя команду вида
envsubst /opt/elastalert/config.yaml в entrypoint-скрипте и доустановкой зависимостей, чтобы это работало.

Конфигурации каких сервисов стека оставлять в репозитории проекта, а какие выносить в отдельный репозиторий мониторинга, зависит от наличия других проектов и того, как они будут переиспользовать стек.

Такой вариант стека имеет следующие преимущества:

Стоит заметить, что в данном подходе не используется ни один из xpack-плагинов.

Допустим вариант использования docker-compose. Главное, что основная конфигурация, состоящая из Dockerfile-ов, конфига Filebeat, конфигов Logstash, правил оповещения, правил автоудаления индексов, находится под системой контроля версий, получая возможность быстрого переразвертывания, хранения истории изменений и всех других преимуществ VCS.

Важно уделять внимание автоматической проверки работоспособности стека. Я предлагаю организовать проверку следующим образом. В самом приложении создается задача, исполняемая по расписанию (в Laravel для этого есть scheduler), скажем, раз в неделю за 5 минут до дейлимитинга. Сама задача вызывает логгер и записывает сообщение с уровнем ALERT. Если весь стек функционирует нормально, то вы получите оповещение. Если такого оповещения нет, а вы к нему привыкли, то это станет сигналом для разбирательств.

Заключение

Я описал, какую пользу можно извлечь из логирования, рассказал о некоторых вариантах, которые можно выбирать на каждом шаге построения стека логирования и мониторинга. Привёл пример стека с описанием каждого компонента. Надеюсь, вы нашли что-то полезное для себя в этом материале. Данные мной рекомендации были опробованы на нескольких проектах и хорошо себя показали в бою. Но следует помнить, что всегда есть, что улучшить.

Источник

Php записать лог в файл

(PHP 4, PHP 5, PHP 7, PHP 8)

log — Натуральный логарифм

Описание

Список параметров

Число, для которого необходимо вычислить логарифм

Необязательное основание логарифма (по умолчанию основание ‘e’, что соответствует натуральному логарифму).

Возвращаемые значения

Смотрите также

User Contributed Notes 8 notes

Seems like unit prefixes should have a standard PHP function. Maybe in the future.

I found this page while looking for a quick unit prefix function. The one by olafurw was voted down, I think because it had unchecked array indexes and /0s. So here it is fixed and readable.

For those interested. Works with older than 4.3 versions.

If you just need to check if N is a perfect power of Base, log() is SLOW compared to a WHILE construct that will be 2x faster!

= ‘fill in your number here’
$base = ‘fill in requested base here’ ;

well i been pulling my hair out trying to get log to work with big numbers and i ended up writing a bclog function so to save everyone else the stress here it is

# Example: How many bits to write 1 billion in binary, last century?

# Suppose we have a dynamically generated list of integers,
# and want to present them as a table. The use of log10 in
# our digit_count helps calculate the proper format string.

# To generate an example, here is a basic function
# returning a list of (pseudo) random numbers.

# Example: A list of random ints dynamically formatted into columns.

print_list_of_ints ( rands ( 11 ));

/* Sample output. Numbers and fonts vary. Visualize monospace!

————————————
1093146637 244503173 1346204527
638304372 140216732 1054707210
573915416 1728677954 2038899669
534854768 12674586
————————————

Источник

error_log

(PHP 4, PHP 5, PHP 7, PHP 8)

error_log — Отправляет сообщение об ошибке заданному обработчику ошибок

Описание

Отправляет сообщение об ошибке в лог веб-сервера или в пользовательский файл.

Список параметров

Сообщение об ошибке, которое должно быть логировано.

Определяет куда отправлять ошибку. Возможны следующие значения:

Возвращаемые значения

Примеры

Пример #1 Примеры использования error_log()

Примечания

error_log() не является бинарно-безопасной функцией. message обрезается по null-символу.

User Contributed Notes 20 notes

Advice to novices: This function works great along with «tail» which is a unix command to watch a log file live. There are versions of Tail for Windows too, like Tail for Win32 or Kiwi Log Viewer.

Using both error_log() and tail to view the php_error.log you can debug code without having to worry so much about printing debug messages to the screen and who they might be seen by.

Further Note: This works even better when you have two monitors setup. One for your browser and IDE and the other for viewing the log files update live as you go.

DO NOT try to output TOO LARGE texts in the error_log();

if you try to output massive amounts of texts it will either cut of the text at about 8ooo characters (for reasonable massive strings,

The default seem to be 1024 but can be changed by adjusting the value of the runtime configuration value of ‘log_errors_max_len’.

Beware! If multiple scripts share the same log file, but run as different users, whichever script logs an error first owns the file, and calls to error_log() run as a different user will fail *silently*!

Nothing more frustrating than trying to figure out why all your error_log calls aren’t actually writing, than to find it was due to a *silent* permission denied error!

You can easily filter messages sent to error_log() using «tail» and «grep» on *nix systems. This makes monitoring debug messages easy to see during development.

Be sure to «tag» your error message with a unique string so you can filter it using «grep»:

On your command line:

In this example, we pipe apache log output to grep (STDIN) which filters it for you only showing messages that contain «DevSys1».

The «-f» option means «follow» which streams all new log entries to your terminal or to any piped command that follows, in this case «grep».

Relative paths are accepted as the destination of message_type 3, but beware that the root directory is determined by the context of the call to error_log(), which can change, so that one instance of error_log () in your code can lead to the creation of multiple log files in different locations.

In a WordPress context, the root directory will be the site’s root in many cases, but it will be /wp-admin/ for AJAX calls, and a plugin’s directory in other cases. If you want all your output to go to one file, use an absolute path.

when using error_log to send email, not all elements of an extra_headers string are handled the same way. «From: » and «Reply-To: » header values will replace the default header values. «Subject: » header values won’t: they are *added* to the mail header but don’t replace the default, leading to mail messages with two Subject fields.

When logging to apache on windows, both error_log and also trigger_error result in an apache status of error on the front of the message. This is bad if all you want to do is log information. However you can simply log to stderr however you will have to do all message assembly:

LogToApache($Message) <
$stderr = fopen(‘php://stderr’, ‘w’);
fwrite($stderr,$Message);
fclose($stderr);
>

«It appears that the system log = stderr if you are running PHP from the command line»

Actually, it seems that PHP logs to stderr if it can’t write to the log file. Command line PHP falls back to stderr because the log file is (usually) only writable by the webserver.

Note that since typical email is unencrypted, sending data about your errors over email using this function could be considered a security risk. How much of a risk it is depends on how much and what type of information you are sending, but the mere act of sending an email when something happens (even if it cannot be read) could itself imply to a sophisticated hacker observing your site over time that they have managed to cause an error.

Of course, security through obscurity is the weakest kind of security, as most open source supporters will agree. This is just something that you should keep in mind.

And of course, whatever you do, make sure that such emails don’t contain sensitive user data.

Another trick to post «HTML» mail body. Just add «Content-Type: text/html; charset=ISO-8859-1» into extra_header string. Of course you can set charset according to your country or Env or content.

stuff

«,1,»eat@joe.com»,»subject :lunch\nContent-Type: text/html; charset=ISO-8859-1″);

Depending on the error, you may also want to add an error 500 header, and a message for the user:

//Multiline error log class
// ersin güvenç 2008 eguvenc@gmail.com
//For break use «\n» instead ‘\n’

Class log <
//
const USER_ERROR_DIR = ‘/home/site/error_log/Site_User_errors.log’ ;
const GENERAL_ERROR_DIR = ‘/home/site/error_log/Site_General_errors.log’ ;

When error_log() unexpectedly uses stdout, you should check if the php.ini value for error_log is empty in your CLI environment. Something as simple as this might restore expected behavior:

After scouring the internet for getting event logging to
work in syslog on Windows 2003, I found the following
from this post and was able to successfully get Windows
Event Viewer to log PHP errors/notices:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *