[英]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)
我基本上想要的是
stdout
和stderr
所有输出都进入日志文件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
代码显示,它调用basicConfig
在getmail.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.