我相信从其他问题中我已经读到日志记录具有单例模式,但我没有成功地正确实施它。
我有一个像这样的
logger.py
文件:
import logging
import os
from concurrent_log_handler import ConcurrentRotatingFileHandler
def create_file_handler(path, filename=None):
if filename is None:
filename = f"app_{os.getlogin()}"
formatter = logging.Formatter('%(asctime)s | %(name)s | %(funcName)s | %(levelname)s | %(message)s')
file_handler = ConcurrentRotatingFileHandler(fr'{path}\{filename}.log', mode='a', maxBytes=1024*1024*10, # 10 Mo per file
backupCount=10)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
return file_handler
假设我有两个其他文件,
file_one.py
(我将首先调用的文件)使用file_two.py
.中的函数来简化
我想要一个来自
file_one.py
的自定义日志文件,所以我在其中创建了这样的日志:
import logging
from logger import create_file_handler
file_handler = create_file_handler(r'C:\custom\path', filename="custom_filename")
le_log = logging.getLogger(__name__)
le_log.setLevel(logging.INFO)
le_log.addHandler(file_handler)
问题是在
file_two.py
我不能把自定义路径也不能把custom_file_name放在create_file_handler
的参数中,因为我事先不知道哪个文件(不仅有file_one.py
)会调用函数file_two.py
。
那么在使用 le_log
中的函数时,如何使用 file_one.py
中的自定义 file_two.py
呢?
目前我在
file_two.py
中创建默认记录器,因为我需要文件中的le_log
变量。
我不知道这是不是最好的做法,但我终于成功了。 在
file_one.py
我放:
import logging
from logs.logger import create_file_handler
file_handler = create_file_handler(r'C:\custom\path', filename="custom_filename")
logging.basicConfig(handlers=[file_handler])
le_log = logging.getLogger(__name__)
le_log.setLevel(logging.INFO)
我在
.basicConfig()
的logging
方法中使用了自定义处理程序,而不是用le_log
添加到.addHandler()
。我想它允许 logging
类通过 file_one.py
中调用的其他文件传播。然后在file_two.py
我放:
import logging
le_log = logging.getLogger(__name__)
le_log.setLevel(logging.INFO)