我有一个Django Web应用程序,它运行一堆帮助程序脚本。每个脚本都编写自己的日志。我注意到脚本正在写入彼此的日志。这些脚本由单独的用户/会话启动。怎么回事?
以下是ScriptA
中记录器的实现import logging
logging.basicConfig(format='%(asctime)s %(message)s',filename='/var/logs/scriptA.log',level=logging.DEBUG)
logging.info("INFO: test log from scriptA"))
同样适用于scriptB,但是有人说运行scriptB,它会写入scriptA.log而不是scriptB.log
似乎日志记录创建了一个共享的全局模块。我怎么能阻止这个
编辑:此处的大多数解决方案适用于同一类中的2个单独日志。我的问题是写入彼此日志的单独脚本/类
答案 0 :(得分:1)
是的,Python的日志记录模块是一个全局模块。我之前遇到过同样的问题。我使用此代码来分隔每个模块/类的日志。
import logging
import sys
class SampleCass:
def __init__(self):
self.set_logger()
self.log = logging.getLogger(__name__)
@run_one
def set_logger():
# this separates the logging from different modules
logger = logging.getLogger(__name__)
console_handler = logging.StreamHandler(sys.stdout)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s %(levelname)s ' +
'%(name)s]: %(message)s',
'%Y-%m-%d %H:%M:%S')
console_handler.setFormatter(formatter)
# add the handler to the class logger
logger.addHandler(console_handler)
def run_once(func):
"""
A decorator to run function only once
:type func: __builtin__.function
:return:
"""
def wrapper(*args, **kwargs):
"""
:param args:
:param kwargs:
:return:
"""
if not wrapper.has_run:
wrapper.has_run = True
return func(*args, **kwargs)
wrapper.has_run = False
return wrapper
现在您可以为您的类使用self.log,它不会干扰其他模块的日志记录。 run_one函数确保在导入函数时,它只运行一次且只运行一次。希望它能帮到你。