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

时间:2020-10-03 03:00:49

标签: python logging

这是我用于设置日志记录级别的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()

但是,如果我使用此设置 并且还使用了django_mailbox随附的命令python3.7 manage.py getmail,我将得到此输出

(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错误?

1 个答案:

答案 0 :(得分:0)

对于第二种情况,会发生这种情况。

如果

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

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

对于第一种情况,快速浏览django_mailbox代码表明它也调用了getmail.py中的basicConfig。由于您用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级别的时间轮换日志文件和一个stdout级别的到INFO的流。一切都像魔术一样工作!

相关问题