我是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
有没有办法避免重复级别名称和日期以使我的错误消息更具可读性?
答案 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