我有一个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个单独的日志。我的问题是单独的脚本/类互相写入日志
是的,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函数可确保当您导入函数时,它将仅运行一次。希望它对您有帮助。