使用python 2.7.9在日志文件中设置消息格式

使用python 2.7.9在日志文件中设置消息格式,python,Python,我是Python编程的初学者 我尝试使用日志模块将日志重定向到文件,但我面临以下问题: 在名为error.log的日志文件中,我有每个日志文件行中重复出现的级别名称和日期 有没有办法避免这个问题 我正在使用Python 2.7.9 下面是我的代码: # error.py # -*- coding: utf-8 -*- import logging import sys logging.basicConfig( level=logging.ERROR, format="%(leve

我是Python编程的初学者

我尝试使用日志模块将日志重定向到文件,但我面临以下问题:

在名为error.log的日志文件中,我有每个日志文件行中重复出现的级别名称和日期

有没有办法避免这个问题

我正在使用Python 2.7.9

下面是我的代码:

# error.py
# -*- coding: utf-8 -*-
import logging
import sys
logging.basicConfig(
    level=logging.ERROR,
    format="%(levelname)s - %(asctime)s - %(message)s",
    filename="error.log",
    filemode='w'
)

class StreamToLogger(object):
    def __init__(self, logger, log_level=logging.DEBUG):
        self.logger = logger
        self.log_level = log_level

    def write(self, text):
        for line in text.rstrip().splitlines():
            self.logger.log(self.log_level, line.rstrip())

stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl
stderr_logger = logging.getLogger('STDERR')
sl = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = sl
#Voluntary error for display in the log
print message
运行此python脚本时,我得到以下文件:

# the error.log file
ERROR - 2015-05-10 17:24:40,726 - Traceback (most recent call last):
ERROR - 2015-05-10 17:24:40,726 -   File "D:\error\error.py", line 27, in <module>
ERROR - 2015-05-10 17:24:40,726 - print message
ERROR - 2015-05-10 17:24:40,726 - NameError
ERROR - 2015-05-10 17:24:40,726 - :
ERROR - 2015-05-10 17:24:40,726 - name 'message' is not defined

有没有办法避免级别名称和日期的重复,以使我的错误消息更具可读性?

由于您是递归的,在写操作中,您应该能够只为self.logger.logself.log\u level,line.rstrip设置第一次迭代 然后将其更改为self.logger.log、line.rstrip之类的内容

对于其余的值

这应该允许您只打印一次错误级别。

格式部分:

logging.basicConfig(
    level=logging.ERROR,
    format="%(levelname)s - %(asctime)s - %(message)s",
    filename="error.log",
    filemode='w'
)
定义如何将所有内容打印到控制台。如果只保留%条消息,则可以消除错误级别和时间戳


如果您试图只保留一次错误级别和时间戳,即:删除所有重复项,恐怕没有现成的方法来使用日志模块。

最后,感谢您的建议,我可以得到我想要的,即仅在错误文件的第一行中定义级别名称和日期

按照您的建议,我将格式变量的值更改为%messages,并格式化了循环中的第一行

我不认为这是最优雅的方式,但它就像我想要的那样工作

这是我的密码:

# error.py
# -*- coding: utf-8 -*-
import logging
from datetime import datetime
import sys
logging.basicConfig(
    level=logging.ERROR,
    format="%(message)s",
    filename="error.log",
    filemode='w'
)

class StreamToLogger(object):
    def __init__(self, logger, log_level=logging.DEBUG):
        self.logger = logger
        self.log_level = log_level

    def write(self, text):
        textLines = text.splitlines()
        for line in textLines:
            if line.startswith("Traceback"):
                self.logger.log(self.log_level, "%s - %s - %s" % (logging.getLevelName(self.log_level), datetime.now(), line.rstrip()))
            else:
                self.logger.log(self.log_level, line.rstrip())

stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl
stderr_logger = logging.getLogger('STDERR')
sl = StreamToLogger(stderr_logger, logging.ERROR)
sys.stderr = sl
#Voluntary error for display in the log
print message
我得到以下日志文件:

# error.log

ERROR - 2015-05-15 21:06:47.234000 - Traceback (most recent call last):
  File "D:\error\error.py", line 32, in <module>

print message

NameError
:
name 'message' is not defined

可能尝试将您的格式变量更改为以下格式=%messagesAh好的,谢谢大家。我想我们可以用过滤器之类的方法来做。