我在这里查看了 python 日志记录类的教程,没有看到任何可以让我为同一输出制作多个不同级别的日志的东西。最后我想要三个日志:(
<timestamp>_DEBUG.log
调试级别)
<timestamp>_INFO.log
(信息级别)
<timestamp>_ERROR.log
(错误级别)
有没有办法在一个脚本中为同一输入生成多个日志文件?
<-------------UPDATE #1-------------->
所以在执行@robert 的建议时,我现在有一个小问题,可能是由于没有完全理解他的代码在做什么。
这是我在 scriptRun.py 中的代码
import os
import logging
logger = logging.getLogger("exceptionsLogger")
debugLogFileHandler = logging.FileHandler("Debug.log")
errorLogFileHandler = logging.FileHandler("Error.Log")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
errorLogFileHandler.setFormatter(formatter)
debugLogFileHandler.setFormatter(formatter)
logger.addHandler(debugLogFileHandler)
logger.addHandler(errorLogFileHandler)
class LevelFilter(logging.Filter):
def __init__(self, level):
self.level = level
def filter(self, record):
return record.levelno == self.level
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR))
directory = []
for dirpath, dirnames, filenames in os.walk("path\to\scripts"):
for filename in [f for f in filenames if f.endswith(".py")]:
directory.append(os.path.join(dirpath, filename))
for entry in directory:
execfile(entry)
for lists in x:
if lists[0] == 2:
logger.error(lists[1]+" "+lists[2])
elif lists[0] == 1:
logger.debug(lists[1]+" "+lists[2])
正在运行的示例是:
import sys
def script2Test2():
print y
def script2Ttest3():
mundo="hungry"
global x
x = []
theTests = (test2, test3)
for test in theTests:
try:
test()
x.append([1,test.__name__," OK"])
except:
error = str(sys.exc_info()[1])
x.append([2,test.__name__,error])
Now to my issue: running scriptRun.py
does not throw any errors when i run it, and error.log
and debug.log
are created, but only error.log
is populated with entries.
any idea why?
<------------------------Update #2----------------------->
So I realized that nothing is being logged that is "lower" than warning. even if i remove the filters and debugLogFileHandler.setLevel(logging.DEBUG)
it does not seem to matter. If I set the actual log command to logger.warning
or higher, it will print to the logs. Of course once I uncomment debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
I get no log activity in Debug.log
. I;m tempted to just make my own log level, but that seems like a really bad idea, in case anyone/anything else uses this code.
<-------------------------Final UPDATE--------------------->
Well I was stupid and forgot to set the logger itself to log DEBUG level events. Since by default the logging class doesn't log anything below warning, it wasnt logging any of the debug information I send it.
Final thanks and shoutout to @Robert for the filter.