使用python 2.7.9

时间:2015-05-10 16:42:07

标签: python

我是Python编程的初学者。

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

在名为&#34的日志文件中; 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

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

3 个答案:

答案 0 :(得分:0)

由于您正在递归,因此在write中您应该能够设置第一次迭代为
self.logger.log(self.log_level, line.rstrip())

然后将其更改为诸如self.logger.log("", line.rstrip())

之类的内容

其余值。

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

答案 1 :(得分:0)

'格式'部分:

logging.basicConfig(
    level=logging.ERROR,
    format="%(levelname)s - %(asctime)s - %(message)s",
    filename="error.log",
    filemode='w'
)

定义如何将所有内容打印到控制台。如果你只保留%(消息)s,你将摆脱错误级别和时间戳。

如果你试图只保留一个错误级别和时间戳(即:删除所有重复项),我担心没有开箱即用的方法来使用日志记录模块。

答案 2 :(得分:0)

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

我将格式变量的值更改为&#34;%(message)s&#34;正如你告诉我的那样,我在循环中格式化了我的第一行。

我不认为这是最优雅的方式,但它的工作方式与我想要的一样。

这是我的代码:

# 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