繁体   English   中英

设置python日志记录级别的正确方法?

[英]proper way to set python logging level?

这是我的 python 文件,用于设置我的日志记录级别

import datetime
import logging
import pytz
import sys


class LoggerWriter:
    def __init__(self, logger, level):
        self.logger = logger
        self.level = level

    def write(self, message):
        if message != '\n':
            self.logger.log(self.level, message)

    def flush(self):
        pass


def initialize_logger():
    # setting up log requirements
    logger = logging.getLogger('csss_site')
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s = %(levelname)s - %(message)s', '%Y-%m-%d %H:%M:%S')
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.DEBUG)
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    sys.stdout = LoggerWriter(logger, logging.INFO)
    sys.stderr = LoggerWriter(logger, logging.WARNING)
    create_log_file(formatter, logger)
    return logger


def create_log_file(formatter, logger):
    date = datetime.datetime.now(pytz.timezone('US/Pacific')).strftime("%Y_%m_%d_%H_%M_%S")
    filename = "logs/{}_csss_site".format(date)
    filehandler = logging.FileHandler("{}.log".format(filename))
    filehandler.setLevel(logging.INFO)
    filehandler.setFormatter(formatter)
    logger.addHandler(filehandler)

我基本上想要的是

  1. stdoutstderr所有输出都进入日志文件
  2. DEBUG级别和更高级别查看所有内容

我通过做来调用函数

logger = initialize_logger()

但是,如果我用这个设置还可以使用命令python3.7 manage.py getmail附带django_mailbox ,我得到这个输出

(envCSSS) csss@csss-website:~/csss-site-in-dev/csss-site/src$ python3.7 manage.py getmail
2020-01-14 18:24:56 = INFO - [settings.py] BASE_DIR set to /home/csss
2020-01-14 18:24:56 = INFO - [settings.py] DEBUG set to True
2020-01-14 18:24:56 = INFO - [settings.py] ROOT_DIR set to /home/csss/csss-site-in-dev
2020-01-14 18:24:56 = INFO - [settings.py] STATIC_URL set to /STATIC_URL/
2020-01-14 18:24:56 = INFO - [settings.py] STATIC_ROOT set to /home/csss/static_root/
2020-01-14 18:24:56 = INFO - [settings.py] MEDIA_URL set to /MEDIA_URL/
2020-01-14 18:24:56 = INFO - [settings.py] MEDIA_ROOT set to /home/csss/media_root/
2020-01-14 18:24:56 = INFO - [settings.py] FILE_FORM_MASTER_DIR set to form_uploads/form_uploads/
2020-01-14 18:24:56 = INFO - [settings.py] FILE_FORM_UPLOAD_DIR set to form_uploads/form_uploads/temporary_files/
2020-01-14 18:24:56 = INFO - [settings.py] DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO set to mailbox_attachments/%Y/%m/%d/
2020-01-14 10:24:57 = WARNING - INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:INFO:django_mailbox.management.commands.getmail:Gathering messages for csss gmail
.....................
2020-01-14 10:24:57 = WARNING - Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):
2020-01-14 10:24:57 = WARNING - WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:WARNING:csss_site:Traceback (most recent call last):

但是,如果我切换到使用logging.basicConfig(level=logging.DEBUG)而不是logger.setLevel(logging.DEBUG) ,这个问题就会停止,但开始发生的是像这样的重复日志行

/home/modernNeo/virtualenvs/envCSSS/bin/python3.7 /media/modernNeo/modernNeo_usb_1/csss-site/csss-site/src/manage.py runserver 0.0.0.0:8000
2020-10-02 19:53:31 = INFO - [settings.py] BASE_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
INFO:csss_site:[settings.py] BASE_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
2020-10-02 19:53:31 = INFO - [settings.py] DEBUG set to True
INFO:csss_site:[settings.py] DEBUG set to True
2020-10-02 19:53:31 = INFO - [settings.py] ENVIRONMENT set to LOCALHOST
INFO:csss_site:[settings.py] ENVIRONMENT set to LOCALHOST
2020-10-02 19:53:31 = INFO - [settings.py] PORT set to 8000
INFO:csss_site:[settings.py] PORT set to 8000
2020-10-02 19:53:31 = INFO - [settings.py] HOST_ADDRESS set to 127.0.0.1
INFO:csss_site:[settings.py] HOST_ADDRESS set to 127.0.0.1
2020-10-02 19:53:31 = INFO - [settings.py] ALLOWED_HOSTS set to ['127.0.0.1']
INFO:csss_site:[settings.py] ALLOWED_HOSTS set to ['127.0.0.1']
2020-10-02 19:53:31 = INFO - [settings.py] DB_TYPE set to postgres
INFO:csss_site:[settings.py] DB_TYPE set to postgres
2020-10-02 19:53:31 = INFO - [settings.py] BRANCH_NAME set to None
INFO:csss_site:[settings.py] BRANCH_NAME set to None
2020-10-02 19:53:31 = INFO - [settings.py] URL_ROOT set to /
INFO:csss_site:[settings.py] URL_ROOT set to /
2020-10-02 19:53:31 = INFO - [settings.py] URL_PATTERN set to 
INFO:csss_site:[settings.py] URL_PATTERN set to 
2020-10-02 19:53:31 = INFO - [settings.py] STATICFILES_DIRS=['/home/modernNeo/NAS_Files/Git/CSSS/exec-photos']
INFO:csss_site:[settings.py] STATICFILES_DIRS=['/home/modernNeo/NAS_Files/Git/CSSS/exec-photos']
2020-10-02 19:53:31 = INFO - [settings.py] ROOT_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
INFO:csss_site:[settings.py] ROOT_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
2020-10-02 19:53:31 = INFO - [settings.py] STATIC_URL set to /STATIC_URL/
INFO:csss_site:[settings.py] STATIC_URL set to /STATIC_URL/
2020-10-02 19:53:31 = INFO - [settings.py] STATIC_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/static_root/
INFO:csss_site:[settings.py] STATIC_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/static_root/
2020-10-02 19:53:31 = INFO - [settings.py] MEDIA_URL set to /MEDIA_URL/
INFO:csss_site:[settings.py] MEDIA_URL set to /MEDIA_URL/
2020-10-02 19:53:31 = INFO - [settings.py] MEDIA_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/media_root/
INFO:csss_site:[settings.py] MEDIA_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/media_root/
2020-10-02 19:53:31 = INFO - [settings.py] FILE_FORM_MASTER_DIR set to form_uploads/form_uploads/
INFO:csss_site:[settings.py] FILE_FORM_MASTER_DIR set to form_uploads/form_uploads/
2020-10-02 19:53:31 = INFO - [settings.py] FILE_FORM_UPLOAD_DIR set to form_uploads/form_uploads/temporary_files/
INFO:csss_site:[settings.py] FILE_FORM_UPLOAD_DIR set to form_uploads/form_uploads/temporary_files/
2020-10-02 19:53:31 = INFO - [settings.py] DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO set to mailbox_attachments/%Y/%m/%d/
INFO:csss_site:[settings.py] DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO set to mailbox_attachments/%Y/%m/%d/
2020-10-02 19:53:31 = INFO - [settings.py] BASE_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
INFO:csss_site:[settings.py] BASE_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
2020-10-02 19:53:31 = INFO - [settings.py] DEBUG set to True
INFO:csss_site:[settings.py] DEBUG set to True
2020-10-02 19:53:31 = INFO - [settings.py] ENVIRONMENT set to LOCALHOST
INFO:csss_site:[settings.py] ENVIRONMENT set to LOCALHOST
2020-10-02 19:53:31 = INFO - [settings.py] PORT set to 8000
INFO:csss_site:[settings.py] PORT set to 8000
2020-10-02 19:53:31 = INFO - [settings.py] HOST_ADDRESS set to 127.0.0.1
INFO:csss_site:[settings.py] HOST_ADDRESS set to 127.0.0.1
2020-10-02 19:53:31 = INFO - [settings.py] ALLOWED_HOSTS set to ['127.0.0.1']
INFO:csss_site:[settings.py] ALLOWED_HOSTS set to ['127.0.0.1']
2020-10-02 19:53:31 = INFO - [settings.py] DB_TYPE set to postgres
INFO:csss_site:[settings.py] DB_TYPE set to postgres
2020-10-02 19:53:31 = INFO - [settings.py] BRANCH_NAME set to None
INFO:csss_site:[settings.py] BRANCH_NAME set to None
2020-10-02 19:53:31 = INFO - [settings.py] URL_ROOT set to /
INFO:csss_site:[settings.py] URL_ROOT set to /
2020-10-02 19:53:31 = INFO - [settings.py] URL_PATTERN set to 
INFO:csss_site:[settings.py] URL_PATTERN set to 
2020-10-02 19:53:31 = INFO - [settings.py] STATICFILES_DIRS=['/home/modernNeo/NAS_Files/Git/CSSS/exec-photos']
INFO:csss_site:[settings.py] STATICFILES_DIRS=['/home/modernNeo/NAS_Files/Git/CSSS/exec-photos']
2020-10-02 19:53:31 = INFO - [settings.py] ROOT_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
INFO:csss_site:[settings.py] ROOT_DIR set to /media/modernNeo/modernNeo_usb_1/csss-site
2020-10-02 19:53:31 = INFO - [settings.py] STATIC_URL set to /STATIC_URL/
INFO:csss_site:[settings.py] STATIC_URL set to /STATIC_URL/
2020-10-02 19:53:31 = INFO - [settings.py] STATIC_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/static_root/
INFO:csss_site:[settings.py] STATIC_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/static_root/
2020-10-02 19:53:31 = INFO - [settings.py] MEDIA_URL set to /MEDIA_URL/
INFO:csss_site:[settings.py] MEDIA_URL set to /MEDIA_URL/
2020-10-02 19:53:31 = INFO - [settings.py] MEDIA_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/media_root/
INFO:csss_site:[settings.py] MEDIA_ROOT set to /media/modernNeo/modernNeo_usb_1/csss-site/media_root/
2020-10-02 19:53:31 = INFO - [settings.py] FILE_FORM_MASTER_DIR set to form_uploads/form_uploads/
INFO:csss_site:[settings.py] FILE_FORM_MASTER_DIR set to form_uploads/form_uploads/
2020-10-02 19:53:31 = INFO - [settings.py] FILE_FORM_UPLOAD_DIR set to form_uploads/form_uploads/temporary_files/
INFO:csss_site:[settings.py] FILE_FORM_UPLOAD_DIR set to form_uploads/form_uploads/temporary_files/
2020-10-02 19:53:31 = INFO - [settings.py] DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO set to mailbox_attachments/%Y/%m/%d/
INFO:csss_site:[settings.py] DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO set to mailbox_attachments/%Y/%m/%d/
2020-10-02 19:53:32 = WARNING - Watching for file changes with StatReloader

WARNING:csss_site:Watching for file changes with StatReloader

INFO:django.utils.autoreload:Watching for file changes with StatReloader
2020-10-02 19:53:32 = INFO - Performing system checks...


INFO:csss_site:Performing system checks...


2020-10-02 19:53:32 = INFO - System check identified no issues (0 silenced).

INFO:csss_site:System check identified no issues (0 silenced).

2020-10-02 19:53:32 = INFO - October 02, 2020 - 19:53:32

INFO:csss_site:October 02, 2020 - 19:53:32

2020-10-02 19:53:32 = INFO - Django version 2.2.13, using settings 'csss.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

INFO:csss_site:Django version 2.2.13, using settings 'csss.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.


Process finished with exit code 0

我的日志设置错误还是django_mailbox有问题?

对于第二种情况,这是发生了什么。

如果没有任何处理程序, logging.basicConfig(level=logging.DEBUG)调用会将StreamHandler添加到root记录器。 此处理程序默认写入stderr

您的记录器没有定义propagate=False ,因此您的记录器处理的任何记录都会传播到root记录器,并以不同的格式再次写出到stderr 因此,您看到了每条日志消息的重复。

对于第一种情况,快速查看django_mailbox代码显示,它调用basicConfiggetmail.py了。 由于您将stderr替换为LoggerWriter类,因此写入stderr日志消息将传递给您的记录器。 这解释了WARNING文本。

然后,与第二种情况相同,它们也被传播到root记录器,该记录器也写入stderror 这就是循环发生的地方。


stdout 和 stderr 的所有输出都进入日志文件

我得到它。 但让我重新表述你想要的:

简单的方式记录程序的所有输出和异常回溯

如果简单这个词符合您的期望,那么您可以尝试使用logger-tt包。

from logger_tt import setup_logging
from logging import getLogger
# import other stuff

setup_logging(capture_print=True)    # config all loggers and capture msg from print(msg)
logger = getLogger(__name__)         # logger for this .py file only

# your code below

就是这样。 它为您提供具有DEBUG级别的时间轮换日志文件和具有INFO级别的stdout流。 一切都像魔术一样工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM