logging Python
| Введение | |
| Пример без специальных библиотек | |
| Пример | |
| Включить Debug | |
| Лог в файл | |
| Форматирование | |
| Передать уровень лога как строку | |
| Похожие статьи |
Введение
В этой статье вы можете изучить примеры организации логов. Будут рассмотремы простые примеры без специальных библиотек для логирования а также примеры с применением библиотеки logging
Пример без специальных библиотек
Скрипт, который я иногда использую для вывода логов на экран или сохранения в файл.
Если пользоваться write_log() желательно передавать log_file явно, ибо
inspect
- это дорогое удовольствие.
import os import shutil import inspect from datetime import datetime def et(): # return datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")[:-3] return datetime.now().strftime("%H-%M-%S-%f")[:-3] def create_directory(path): if os.path.isdir(path): # print(f"Directory {path} already exists.") pass elif os.path.exists(path): plg(f"Path {path} is not a directory.") else: os.makedirs(path) plg(f"Created directory {path}.") def plg(message, severity="INFO"): sp = "" sev = severity.lower() if sev in ("warn", "error"): width = shutil.get_terminal_size().columns line = f'{"-" * width}' print(line) if sev == "warn": sp = "\n" elif sev == "error": sp = "\n\n" print(f"{sp}{et()} {message}") def write_log(message, log_file=None, log_dir=None): if log_file is None: frame = inspect.stack()[1] filename = frame.filename # Только для Windows # log_file = filename.rsplit("\", 1)[-1] + ".log" log_file = os.path.basename(filename) + ".log" if log_dir is not None: create_directory(log_dir) path = os.path.join(log_dir, log_file) else: path = log_file with open(path, "a", encoding="utf-8") as f: f.write(f"{et()} {message}\n")
Пример
По умолчанию Info и Debug отключены. В этом легко убедиться запустив скрипт следюущего содержания
import logging logging.critical("Critial Log") logging.error("Error Log") logging.warning("Warning Log") logging.info("Info Log") logging.debug("Debug Log")
python log_example.py
CRITICAL:root:Critial Log ERROR:root:Error Log WARNING:root:Warning Log
Включить Debug
Если теперь нужно повысить детализацию лога сделать это можно с помощью logging.basicConfig
import logging logging.basicConfig(level=logging.DEBUG) logging.critical("Critial Log") logging.error("Error Log") logging.warning("Warning Log") logging.info("Info Log") logging.debug("Debug Log")
python log_example.py
CRITICAL:root:Critial Log ERROR:root:Error Log WARNING:root:Warning Log INFO:root:Info Log DEBUG:root:Debug Log
Лог в файл
import logging logging.basicConfig(filename='example.log', level=logging.DEBUG) logging.critical("Critial Log") logging.error("Error Log") logging.warning("Warning Log") logging.info("Info Log") logging.debug("Debug Log")
python log_example.py
В терминал уже ничего не выводится, зато появился файл example.log
cat example.log
CRITICAL:root:Critial Log ERROR:root:Error Log WARNING:root:Warning Log INFO:root:Info Log DEBUG:root:Debug Log
Форматирование
Можно задать нужный вам формат логов с помощью logrecord-attributes
# log_example.py import logging def main() -> None: logging.basicConfig( filename="example.log", level=logging.DEBUG, format="%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) logging.critical("Critial Log") logging.error("Error Log") logging.warning("Warning Log") logging.info("Info Log") logging.debug("Debug Log") if __name__ == "__main__": main()
python log_example.py
cat example.log
2026-04-12 15:58:22 CRITICAL: Critial Log 2026-04-12 15:58:22 ERROR: Error Log 2026-04-12 15:58:22 WARNING: Warning Log 2026-04-12 15:58:22 INFO: Info Log 2026-04-12 15:58:22 DEBUG: Debug Log
Передать уровень лога как строку
Часто уровень лога прописан где-то в конфиге. Поэтому он будет прочитан и передат в функцию как строка а не как объект вида
logging.critical … logging.debug
В этом случае нужно использовать
logginb.getLevelName()
# log_example.py import logging def main(log_level) -> None: level = str(log_level).upper() logging.basicConfig( level=logging.getLevelName(level), format="%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) logging.critical("Critial Log") logging.error("Error Log") logging.warning("Warning Log") logging.info("Info Log") logging.debug("Debug Log") if __name__ == "__main__": main("Error")
python log_example.py
2026-04-12 15:58:22 CRITICAL: Critial Log 2026-04-12 15:58:22 ERROR: Error Log
Автор статьи: Андрей Олегович
| C | |
| C++ | |
| Go | |
| Groovy | |
| Java | |
| JavaScript | |
| PHP | |
| Python | |
| Ruby | |
| .NET/C# | |
| Thrift | |
| Теория Программирования |