我有一個專門針對我的項目的通用記錄器實例。它會自動創建並附加2個處理程序(StreamHandler
和TimedRotatingFileHandler
),並預先配置不同的格式等。現在我是否需要在Python項目中的模塊之間共享記錄器實例?
logging_formatters = {
'fmt': "%(asctime)s [%(levelname)8s:%(process)05d] [%(module)10s:%(lineno)03d] (%(name)s) %(message)s",
'datefmt': "%Y-%m-%d %H:%M:%S"
}
def get_logger(
application_name=None,
filename=None,
*args,
**kwargs
):
if not isinstance(application_name, str):
raise ValueError("Logger class expects a string type application name")
if filename is None:
filename = application_name
if not filename.endswith(".log"):
filename = filename.split('.')[0] + ".log"
log_path = kwargs.get('log_path')
service_name = kwargs.get('service_name', '')
console_level = kwargs.get('console_level', logging.INFO)
file_level = kwargs.get('file_level', logging.DEBUG)
logger = logging.getLogger(application_name)
if len(logger.handlers) > 0:
return logger
# Create 2 handlers, and add them to the logger created
# ...
# ...
# ...
,假設我的燒瓶項目的結構類似於:
/
- app.py
- settings.py
- dir1/
- __init__.py
- mod1.py
- dir2/
- __init__.py
- mod2.py
我開始使用python app.py
服務器。 app.py
本身導入了dir1.mod1
和dir2.mod2
模塊。每個這些模塊的創建自己的記錄器實例如下:
logger = log_package.get_logger(
application_name='{}.{}'.format(settings.APPLICATION_NAME, __name__),
filename=settings.LOG_FILE_NAME,
service_name=settings.SERVICE_NAME,
)
,並在app.py
情況下,它是:
logger = log_package.get_logger(
application_name='{}.{}'.format(settings.APPLICATION_NAME, 'run'),
filename=settings.LOG_FILE_NAME,
service_name=settings.SERVICE_NAME,
)
現在,我面臨的問題是; TimedRotatingFileHandler
對於所有子模塊(即,dir1.mod1
,dir2.mod2
等)都正常工作,但app.py
的日誌未被轉存到新文件。該特定實例將日誌寫入與服務啓動時相同的文件。例如。如果我在2017-07-11
上啓動服務,則app.py
將繼續將日誌寫入LOG_FILE_NAME.log.2017-07-11
,而其他模塊每天都在滾動(when=midnight
),並且新日誌正在寫入LOG_FILE_NAME.log
。
可能是背後的問題TimedRotatingFileHandler
不適用於特定文件?我跑了目錄中的所有文件中的命令lsof
,和這是輸出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 23795 ubuntu 4w REG 202,1 2680401 150244 /path/to/LOG_FILE_NAME.2017-07-12
python 23795 ubuntu 33w REG 202,1 397074 150256 /path/to/LOG_FILE_NAME.log
我做需要跨模塊共享記錄器實例在Python項目?我認爲這不應該是必需的,因爲日誌模塊本身是線程安全的。
我更新了我的答案。 –