如何配置日志记录到项目中的所有脚本?
How to configure logging to all scripts in the prject?
我在 config.py
中添加了以下内容:
import time
import logging
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO)
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.INFO)
fileHandler = logging.FileHandler("{0}.log".format(time.strftime('%Y%m%d%H%M%S')))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)
然后我在做
from config import *
在我所有的脚本和导入的文件中。
不幸的是,这会导致创建多个日志文件。
如何解决这个问题?我不想集中 config.py
将日志记录配置到控制台和文件。
案例一:独立脚本/程序
如果我们谈论的是多个独立的脚本,那么应该以相同的方式设置日志记录:我会说,每个独立的应用程序都应该有自己的日志。如果您绝对不想这样做,则必须
- 确保所有应用程序都具有相同的日志文件名(例如,在 config.py 中创建一个函数,其参数 "timestamp" 由您的脚本提供
- 指定
append
filemode for the fileHandler
- 确保
config.py
不会在某处被调用两次,因为您会添加两次日志处理程序,这将导致每条日志消息被打印两次。
案例二:由模块组成的大型应用
如果我们谈论的是一个由模块组成的大型应用程序,您可以采用如下结构:
config.py:
def set_up_logging():
# your logging setup code
模块示例 (some_module.py):
import logging
def some_function():
logger = logging.getLogger(__name__)
[...]
logger.info('sample log')
[...]
主要示例 (main.py)
import logging
from config import set_up_logging
from some_module import some_function
def main():
set_up_logging()
logger = logging.getLogger(__name__)
logger.info('Executing some function')
some_function()
logger.info('Finished')
if __name__ == '__main__':
main()
解释:
- 通过在 main() 中调用
set_up_logging()
,您可以配置您的应用程序根记录器
- 每个模块都从 main() 调用,并通过
logger = logging.getLogger(__name__)
获取其记录器。由于模块记录器位于根记录器下方的层次结构中,因此这些日志记录 "propagated up" 到达根记录器并由根记录器的处理程序处理。
有关详细信息,请参阅 Pythons logging module doc and/or the logging cookbook
我在 config.py
中添加了以下内容:
import time
import logging
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.INFO)
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.INFO)
fileHandler = logging.FileHandler("{0}.log".format(time.strftime('%Y%m%d%H%M%S')))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)
然后我在做
from config import *
在我所有的脚本和导入的文件中。
不幸的是,这会导致创建多个日志文件。
如何解决这个问题?我不想集中 config.py
将日志记录配置到控制台和文件。
案例一:独立脚本/程序
如果我们谈论的是多个独立的脚本,那么应该以相同的方式设置日志记录:我会说,每个独立的应用程序都应该有自己的日志。如果您绝对不想这样做,则必须
- 确保所有应用程序都具有相同的日志文件名(例如,在 config.py 中创建一个函数,其参数 "timestamp" 由您的脚本提供
- 指定
append
filemode for the fileHandler - 确保
config.py
不会在某处被调用两次,因为您会添加两次日志处理程序,这将导致每条日志消息被打印两次。
案例二:由模块组成的大型应用
如果我们谈论的是一个由模块组成的大型应用程序,您可以采用如下结构:
config.py:
def set_up_logging():
# your logging setup code
模块示例 (some_module.py):
import logging
def some_function():
logger = logging.getLogger(__name__)
[...]
logger.info('sample log')
[...]
主要示例 (main.py)
import logging
from config import set_up_logging
from some_module import some_function
def main():
set_up_logging()
logger = logging.getLogger(__name__)
logger.info('Executing some function')
some_function()
logger.info('Finished')
if __name__ == '__main__':
main()
解释:
- 通过在 main() 中调用
set_up_logging()
,您可以配置您的应用程序根记录器 - 每个模块都从 main() 调用,并通过
logger = logging.getLogger(__name__)
获取其记录器。由于模块记录器位于根记录器下方的层次结构中,因此这些日志记录 "propagated up" 到达根记录器并由根记录器的处理程序处理。
有关详细信息,请参阅 Pythons logging module doc and/or the logging cookbook