我有一个包含一些函数的Python文件。当"主要"函数运行,它贯穿函数。每个函数都需要将一些文本写入同一个日志文件。
我写了以下代码。在每个函数中,文件处理程序在此声明为全局。我想知道是否有更好的方法来实现这一目标?
LOG_FILE_NAME = 'TestLog.log'
f = None
def log1():
global f
print 'log1 called'
f.write('log1 result' + '\n')
def log2():
global f
print 'log2 called'
f.write('log2 result' + '\n')
logFileDir = LOG_FILE_NAME
f = open(logFileDir, 'w')
log1()
log2()
f.close()
答案 0 :(得分:1)
一种方法是将自己的简单日志记录函数编写为闭包:
def create_logger(log_filename = 'TestLog.log'):
f = open(log_filename, 'w')
def logger(text):
f.write(text + '\n')
return logger,f.close
logwrite,logclose = create_logger()
def log1():
print 'log1 called'
logwrite('log1 result')
def log2():
print 'log2 called'
logwrite('log2 result')
log1()
log2()
logclose()
它避免了必须使用global
,封装文件对象,简化了调用,并允许您通过为每个所需的文件名调用create_logger
来使用多个不同的文件名。例如,您可能希望在日志消息中添加日期/时间戳,只需通过增强logger
功能在一个地方完成。
答案 1 :(得分:1)
扩展Tom Dalton的链接(docs.python.org/2/howto/logging.html#logging-to-a-file):
import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
也会写这个文件
DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too
在您的示例中,您可以使用全局记录器,并且每个函数都可以调用它
import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
def log1():
logging.info('log1')
def log2():
logging.info('log2')
if __name__ == '__main__':
log1()
log2()
如果您想要多个记录器,可以使用logging.getLogger()
,记录模块有很大的灵活性,请查看文档(在链接中)。