Инструменты пользователя

Инструменты сайта


develop:pyton:logger

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:pyton:logger [2022/12/03 11:39]
admin
develop:pyton:logger [2023/02/01 09:50] (текущий)
admin
Строка 22: Строка 22:
  
 Собсна структура конфига ниже, перечисляются форматтеры, логгеры, хендлеры, можно создавать несколько разных комбинаций, каждая со своими параметрами и для каждой применяются указанные правила логирования (место, формат, устр-во и т.д.)\\ Собсна структура конфига ниже, перечисляются форматтеры, логгеры, хендлеры, можно создавать несколько разных комбинаций, каждая со своими параметрами и для каждой применяются указанные правила логирования (место, формат, устр-во и т.д.)\\
-Лучше хранить в отдельном "xml" файле\\+ 
 +Конфиг можно хранить в отдельном файле, но тогда нет возможности использовать переменные, можно обернуть в python объект, тогда чики-пики. [[https://habr.com/ru/company/otus/blog/590067/|тут есть пример]]\\ 
 + 
 +Настройка целевого уровня задается и в loggers и в handlers, сначала фильтруется в первом, затем во втором\\
  
 <code json> <code json>
Строка 34: Строка 37:
 } }
 </code> </code>
 +
 +
  
 Для использования JSON нужен модуль [[https://pypi.org/project/python-json-logger/|"python-json-logger"]]\\ Для использования JSON нужен модуль [[https://pypi.org/project/python-json-logger/|"python-json-logger"]]\\
Строка 39: Строка 44:
  
 <details> <details>
-<summary>:!: Боевой пример </summary>+<summary>:!: Боевой пример. Три типа логов </summary> 
 +Три типа логов: 
 +  * Общий 
 +  * Только ошибки 
 +  * Логирование спец событий, в данном случае д-я пользователей 
  
 Использование Использование
 <code python> <code python>
 +#!/usr/bin/python3.8
 +
 import loggers import loggers
  
 logger = loggers.get_logger('main') logger = loggers.get_logger('main')
 +usr_logger = loggers.get_logger('usrlog', template = "usr_actions")
 +
 +logger.info("Simple logger, level == info")
 +logger.error("Simple logger, level == error")
  
-logger.info("This is test text, level == info"+usr_logger.info("User log, level == info", extra={"username": "myname"})
-logger.error("This is test textlevel == error")+
 </code> </code>
  
  
-Объект логгера. Думаю тут можно переработать/оптимизировать, сырой пример+Создание объекта логгера
 <code python> <code python>
 #!/usr/bin/python3.8 #!/usr/bin/python3.8
Строка 63: Строка 78:
 FOLDER_LOG = "log" FOLDER_LOG = "log"
 LOGGING_CONFIG_FILE = 'logger_config.json' LOGGING_CONFIG_FILE = 'logger_config.json'
 +
  
 def create_log_folder(folder=FOLDER_LOG): def create_log_folder(folder=FOLDER_LOG):
Строка 69: Строка 85:
  
  
-def get_logger(name, template='default'):+def get_logger(name, template='simple'):
  create_log_folder()  create_log_folder()
  with open(LOGGING_CONFIG_FILE, "r") as f:  with open(LOGGING_CONFIG_FILE, "r") as f:
Строка 76: Строка 92:
  logging.config.dictConfig(dict_config)  logging.config.dictConfig(dict_config)
  return logging.getLogger(name)  return logging.getLogger(name)
- 
- 
-def get_default_logger(): 
- create_log_folder() 
- with open(LOGGING_CONFIG_FILE, "r") as f: 
- logging.config.dictConfig(json.load(f)) 
- 
- return logging.getLogger("default") 
 </code> </code>
  
Строка 93: Строка 101:
     "disable_existing_loggers": false,     "disable_existing_loggers": false,
     "formatters": {     "formatters": {
-        "default": {+        "strings": {
             "format": "%(asctime)s - %(processName)-10s - %(name)-10s - %(levelname)-8s - %(message)s",             "format": "%(asctime)s - %(processName)-10s - %(name)-10s - %(levelname)-8s - %(message)s",
             "datefmt": "%Y-%m-%d %H:%M:%S"             "datefmt": "%Y-%m-%d %H:%M:%S"
Строка 99: Строка 107:
         "json": {         "json": {
             "()": "pythonjsonlogger.jsonlogger.JsonFormatter",             "()": "pythonjsonlogger.jsonlogger.JsonFormatter",
-            "format": "[ %(asctime)s ] %(levelname)s %(message)s", +            "format": "[ %(asctime)s ] %(username)s %(message)s", 
-            "datefmt": "%d/%m/%y ( %H:%M:%S )"+            "datefmt": "%Y-%m-%%H:%M:%S",
-            "rename_fields":+
-                "asctime": "time", +
-                "levelname": "level" +
-            },+
             "json_indent": 4             "json_indent": 4
         }         }
     },     },
     "handlers": {     "handlers": {
-        "logfile": { +        "mainlog": { 
-            "formatter": "default", +            "formatter": "strings", 
-            "level": "ERROR",+            "level": "INFO",
             "class": "logging.handlers.RotatingFileHandler",             "class": "logging.handlers.RotatingFileHandler",
             "filename": "log/main.log",             "filename": "log/main.log",
 +            "backupCount": 2
 +        },
 +        "errorlog": {
 +            "formatter": "strings",
 +            "level": "ERROR",
 +            "class": "logging.handlers.RotatingFileHandler",
 +            "filename": "log/error.log",
             "backupCount": 2             "backupCount": 2
         },         },
         "json": {         "json": {
             "formatter": "json",             "formatter": "json",
 +            "level": "INFO",
             "class": "logging.handlers.RotatingFileHandler",             "class": "logging.handlers.RotatingFileHandler",
-            "filename": "log/main.xml+            "filename": "log/usrlog.xml"
-        }, +
-        "console":+
-            "formatter": "default", +
-            "level": "ERROR", +
-            "class": "logging.StreamHandler", +
-            "stream": "ext://sys.stdout"+
         }         }
     },     },
     "loggers": {     "loggers": {
-        "default": { +        "simple": { 
-            "level": "INFO",   +            "level": "DEBUG", 
-            "handlers": ["logfile", "json", "console"]+            "handlers": ["mainlog", "errorlog"
 +        }, 
 +        "usr_actions":
 +            "level": "DEBUG", 
 +            "handlers": ["json"]
         }         }
     }     }
Строка 137: Строка 147:
 </code> </code>
 </details> </details>
 +
 +
  
 ===== Примеры ===== ===== Примеры =====
 +<details>
 +<summary>:!: Минимальный пример для логирования</summary>
 +<code python>
 +import logging
 +from datetime import datetime
 +
 +start_date = datetime.strftime(datetime.now(), "%Y%m%d_%H%M%S")
 +log_path = f"{start_date}.log"
 +
 +#Настройка логирования.
 +log = logging.getLogger()
 +log.setLevel(logging.INFO)
 +fh = logging.FileHandler(filename=log_path)
 +fh.setLevel(logging.INFO)
 +formatter = logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s')
 +fh.setFormatter(formatter)
 +log.addHandler(fh)
 +
 +log.info("test test ")
 +</code>
 +</details>
  
  
 <details> <details>
 <summary>:!: Еще примеры </summary> <summary>:!: Еще примеры </summary>
- 
 <code python> <code python>
 import logging import logging
develop/pyton/logger.1670067556.txt.gz · Последнее изменение: 2022/12/03 11:39 — admin