这是我用于设置日志记录级别的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()
但是,如果我使用此设置 并且还使用了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
错误?
答案 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
的流。一切都像魔术一样工作!