Как записать лог программы

Несколько вариантов как быстро организовать запись данных в лог-файл.

Строки текста

$log = date(‘Y-m-d H:i:s’) . ‘ Запись в лог’; file_put_contents(__DIR__ . ‘/log.txt’, $log . PHP_EOL, FILE_APPEND);

Запись в лог-файле:

2019-02-02 16:00:38 Запись в лог

Массивы

Если нужно записать в лог обычный массив, массив с индексами или многомерный массив, поможет функция print_r() .

$array = array( ‘foo’ => ‘bar’, ‘helo’ => ‘world’, ‘array’ => array(1, 2) ); $log = date(‘Y-m-d H:i:s’) . ‘ ‘ . print_r($array, true); file_put_contents(__DIR__ . ‘/log.txt’, $log . PHP_EOL, FILE_APPEND);

Запись в лог-файле:

2019-02-02 16:43:27 Array ( [foo] => bar [helo] => world [array] => Array ( [0] => 1 [1] => 2 ) )

В одну строку

$array = array( ‘foo’ => ‘bar’, ‘helo’ => ‘world’, ‘array’ => array(1, 2) ); $log = date(‘Y-m-d H:i:s’) . ‘ ‘; $log .= str_replace(array(‘ ‘, PHP_EOL), », print_r($array, true)); file_put_contents(__DIR__ . ‘/log.txt’, $log . PHP_EOL, FILE_APPEND);
2019-02-02 16:56:00 Array([foo] => bar[helo] => world[array] => Array([0] => 1[1] => 2))

Результат работы PHP скрипта

Если нужно добавить в лог результат работы PHP скрипта, помогут функции буферизации ob_start() и ob_get_clean() .

Компьютерная диагностика Субару — программы для снятия и просмотра логов


ob_start(); // Вывод заголовков браузера. foreach (getallheaders() as $name => $value) < echo «$name: $valuen»; >$log = date(‘Y-m-d H:i:s’) . PHP_EOL . ob_get_clean() . PHP_EOL; file_put_contents(__DIR__ . ‘/log.txt’, $log, FILE_APPEND);

Запись в лог-файле:

2019-11-20 12:54:58 Host: example.com X-HTTPS: 1 X-Forwarded-Proto: https Connection: close cache-control: max-age=0 upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534 (KHTML, like Gecko) sec-fetch-user: ?1 accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 x-compress: null sec-fetch-site: none sec-fetch-mode: navigate accept-encoding: gzip, deflate, br accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 cookie: PHPSESSID=123

Запись в лог ошибок PHP

Если логирование предполагает фиксацию только ошибок, то лучше писать их в общий лог PHP, подробнее на php.net.

error_reporting(E_ALL); ini_set(‘error_log’, __DIR__ . ‘/php-errors.log’); error_log(‘Запись в лог’, 0);
[02-Feb-2019 20:18:17 Europe/Moscow] Запись в лог

Источник: snipp.ru

Введение в logging на Python

22 Ноя. 2020 , Python, 58512 просмотров, The Ultimate Guide To Python Logging

В стандартной библиотеке Python есть замечательный пакет для логирования — logging. В сети бытует мнение, что он сложный и настраивать его сплошная боль. В этой статье я попробую убедить вас в обратном. Мы разберём что из себя представляет этот пакет, изучим основные компоненты и закрепим материал практическим примером.

КАК НОВИЧКУ ЗАПИСАТЬ ЛОГИ С WEB??? — ПОКАЗУЮ ПРОСТОЙ СПОСОБ НЕ БЫТЬ ДЖУНОМ))

Зачем нужны логи?

Логи это рентген снимок выполнения вашей программы. Чем детальнее лог, тем проще разобраться в нестандартных ситуациях, которые могут приключиться с вашим скриптом. Наиболее популярным примером логов служат access логи веб-сервера, например, Apache httpd или nginx. Пример куска access лога моего блога:

Читайте также:
Программа своими руками мебель

92.63.107.227 — — [04/Nov/2020:06:30:48 +0000] «GET /ru/hosted-open-vpn-server/ HTTP/1.1» 301 169 «-» «python-requests/2.11.1» «-» 92.63.107.227 — — [04/Nov/2020:06:30:49 +0000] «GET /ru/data-engineering-course/ HTTP/1.1» 301 169 «-» «python-requests/2.11.1» «-» 213.180.203.50 — — [04/Nov/2020:06:36:07 +0000] «GET / HTTP/1.1» 301 169 «-» «Mozilla/5.0 (compatible; YandexMetrika/2.0; +http://yandex.com/bots yabs01)» «-» 114.119.160.75 — — [04/Nov/2020:06:36:41 +0000] «GET /robots.txt HTTP/1.1» 301 169 «-» «(compatible;PetalBot;+https://aspiegel.com/petalbot)» «10.179.80.67» 90.180.35.207 — — [04/Nov/2020:06:47:11 +0000] «GET / HTTP/1.0» 301 169 «-» «-» «-» 46.246.122.77 — — [04/Nov/2020:06:53:22 +0000] «GET / HTTP/1.1» 301 169 «» «Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36» «-» 66.249.76.16 — — [04/Nov/2020:06:53:30 +0000] «GET / HTTP/1.1» 301 169 «-» «Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)» «-» 66.102.9.118 — — [04/Nov/2020:07:11:19 +0000] «GET / HTTP/1.1» 301 169 «-» «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon» «46.159.204.234» 71.6.167.142 — — [04/Nov/2020:07:11:55 +0000] «GET / HTTP/1.1» 301 169 «-» «Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36» «-»

Помимо access логов веб-сервер также пишет error лог, там хранится информация обо всех ошибках при обработке HTTP запросов. Также и в ваших скриптах, логи могут делиться на информационные — вывод текущего состояния выполнения, отладочной информации, и на логи с ошибками — вывод исключений, ошибок с дополнительной информацией для отладки, содержащей контекст).

logging и Python

Точкой входа в работу с логированием в Python является библиотека logging. На первый взгляд может показаться, что библиотека сложная и запутанная, но потратив некоторое время на её изучение, можно убедиться в обратном. Для меня logging это классический пример дизайна ООП, где композиция преобладает над наследованием, поэтому в исходном коде библиотеки можно встретить множество функциональных классов. Цель этого туториала разобрать по косточкам каждый класс и воссоединить их в единый механизм логирования в Python. Начнём-с.

Logger

Чтобы начать работу с logging необходимо в импортировать библиотеку logging и вызвать функцию getLogger, передав ей имя будущего логера. Функция вернёт инстанс объекта Logger. Логер это рычаг за который мы дёргаем каждый раз, когда нам нужно записать информацию в лог.

import logging logger = logging.getLogger(‘logger’)

Заметьте, что функция getLogger принимает на вход параметр — имя логера. Можно назначать любое имя или __name__ . Вызов getLogger с одинаковым названием вернёт один и тот же инстанс логера.

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

Класс Logger предоставляет наружу несколько методов для записи сообщений разного уровня. Уровни необходимы для понимания контекста сообщения/лога, который мы пишем. В logging существует несколько уровней:

  1. DEBUG — уровень отладочной информации, зачастую помогает при разработке приложения на машине программиста.
  2. INFO — уровень вспомогательной информации о ходе работы приложения/скрипта.
  3. WARNING — уровень предупреждения. Например, мы можем предупреждать о том, что та или иная функция будет удалена в будущих версиях вашего приложения.
  4. ERROR — с таким уровнем разработчики пишут логи с ошибками, например, о том, что внешний сервис недоступен.
  5. CRITICAL — уровень сообщений после которых работа приложения продолжаться не может.
Читайте также:
Подготовка к соревнованиям по жиму лежа программа

По умолчанию в logging задан уровень WARNING, это означает, что сообщения уровня DEBUG и INFOбудут игнорироваться при записи в лог. Разработчик может самостоятельно задать необходимый ему уровень логирования через метод setLevel у инстанса Logger:

logger.setLevel(logging.DEBUG)

Методы для записи сообщений с разными уровнями именуются по тому же принципу:

logger.debug(‘debug info’) logger.info(‘info’) logger.warning(‘warning’) logger.error(‘debug info’) logger.critical(‘debug info’)

Также есть ещё один метод — exception . Его желательно вызывать в блоке except при обработке исключения. В это случае он сможет уловить контекст исключения и записать его в лог:

try: 1/0 except : logger.exception(‘exception’)

Handler

Задача класса Handler и его потомков обрабатывать запись сообщений/логов. Т.е. Handler отвечает за то куда будут записаны сообщения. В базовом наборе logging предоставляет ряд готовых классов-обработчиков:

  • SteamHandler — запись в поток, например, stdout или stderr.
  • FileHandler — запись в файл, класс имеет множество производных классов с различной функциональностью (ротация файлов логов по размеру, времени и т.д.)
  • SocketHandler — запись сообщений в сокет по TCP
  • DatagramHandler — запись сообщений в сокет по UDP
  • SysLogHandler — запись в syslog
  • HTTPHandler — запись по HTTP

Это далеко не полный список. Чтобы посмотреть все, перейдите по ссылке выше. Для указания Handler, необходимо у инстанса Logger вызвать метод addHandler и передать туда инстанс класса Handler. У одного Logger инстанса может быть множество обработчиков.

Пример записи лога в stdout:

import sys import logging from logging import StreamHandler logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handler = StreamHandler(stream=sys.stdout) logger.addHandler(handler) logger.debug(‘debug information’)

Если запустить этот скрипт, то можно увидеть сообщение:

debug information

Шпаргалка по логированию на Python

Обложка: Шпаргалка по логированию на Python

Если Вы хотя бы немного знакомы с программированием и пробовали запускать что-то «в продакшен», то вам наверняка станет больно от такого диалога:

— Вась, у нас там приложение слегло. Посмотри, что случилось?

— Эмм… А как я это сделаю.

Да, у Василия, судя по всему, не настроено логирование. И это ужасно, хотя бы по нескольким причинам:

  1. Он никогда не узнает, из-за чего его приложение упало.
  2. Он не сможет отследить, что привело к ошибке (даже если приложение не упало).
  3. Он не сможет посмотреть состояние своей системы в момент времени N.
  4. Он не сможет профилактически поглядывать в логи, чтобы следить за работоспособностью приложения.
  5. Он не сможет хвастаться своим… (кхе-кхе).

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

Логирование — крайне важная штука в программировании.

В языке Python основным инструментом для логирования является библиотека logging . Так давайте вместе с IT Resume рассмотрим её подробней.

Что такое logging?

Модуль logging в Python — это набор функций и классов, которые позволяют регистрировать события, происходящие во время работы кода. Этот модуль входит в стандартную библиотеку, поэтому для его использования достаточно написать лишь одну строку:

import logging

Основная функция, которая пригодится Вам для работы с этим модулем — basicConfig() . В ней Вы будете указывать все основные настройки (по крайней мере, на базовом уровне).

Читайте также:
По тексту программы определите условие задачи

У функции basicConfig() 3 основных параметра:

  1. level — уровень логирования на Python;
  2. filename — место, куда мы направляем логи;
  3. format — вид, в котором мы сохраняем результат.

Давайте рассмотрим каждый из параметров более подробно.

Уровни логирования на Python

Наверно, всем очевидно, что события, которые генерирует наш код кардинально могут отличаться между собой по степени важности. Одно дело отлавливать критические ошибки ( FatalError ), а другое — информационные сообщения (например, момент логина пользователя на сайте).

Соответственно, чтобы не засорять логи лишней информацией, в basicConfig() Вы можете указать минимальный уровень фиксируемых событий.

По умолчанию фиксируются только предупреждения ( WARNINGS ) и события с более высоким приоритетом: ошибки ( ERRORS ) и критические ошибки ( CRITICALS ).

Иллюстрация: логирование на Python

Если Вы хотите посмотреть все сообщения, необходимо передать соответствующий уровень ошибок:

logging.basicConfig(level=logging.DEBUG)

А далее, чтобы записать информационное сообщение (или вывести его в консоль, об этом поговорим чуть позже), достаточно написать такой код:

logging.debug(‘debug message’) logging.info(‘info message’)

И так далее. Теперь давайте обсудим, куда наши сообщения попадают.

Отображение лога и запись в файл

За место, в которое попадают логи, отвечает параметр filename в basicConfig . По умолчанию все Ваши логи будут улетать в консоль.

Другими словами, если Вы просто выполните такой код:

import logging logging.error(‘WOW’)

То сообщение WOW придёт Вам в консоль. Понятно, что в консоли никому эти сообщения не нужны. Как же тогда направить запись лога в файл? Очень просто:

logging.basicConfig(filename = «mylog.log»)

Ок, с записью в файл и выбором уровня логирования все более-менее понятно. А как настроить свой шаблон? Разберёмся.

Кстати, мы собрали для Вас сублимированную шпаргалку по логированию на Python в виде карточек. У нас ещё много полезностей, не пожалеете

Форматирование лога

Итак, последнее, с чем нам нужно разобраться — форматирование лога. Эта опция позволяет Вам дополнять лог полезной информацией — датой, названием файла с ошибкой, номером строки, названием метода и так далее.

Сделать это можно, как все уже догадались, с помощью параметра format .

Например, если внутри basicConfig указать:

format = «%(asctime)s — %(levelname)s — %(funcName)s: %(lineno)d — %(message)s»

То вывод ошибки будет выглядеть так:

2019-01-16 10:35:12,468 — ERROR — :1 — Hello, world!

Вы можете сами выбирать, какую информацию включить в лог, а какую оставить. По умолчанию формат такой:

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

Эпилог

Что же, мы разобрали все основные параметры модуля logging и функции basicConfig , которые позволят Вам настроить базовое логирование в Вашем проекте. Дальше — только практика и набивание шишек

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

import logging logging.basicConfig( level=logging.DEBUG, filename = «mylog.log», format = «%(asctime)s — %(module)s — %(levelname)s — %(funcName)s: %(lineno)d — %(message)s», datefmt=’%H:%M:%S’, ) logging.info(‘Hello’)

Если хотите разобраться с параметрами более подробно, Вам поможет официальная документация (очень неплохая, кстати).

Источник: tproger.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru