簡體   English   中英

Python 日志記錄創建空日志文件

[英]Python logging creates empty log file

我正在嘗試設置一個日志配置以在我的不同模塊中使用。 我按照不同的教程和 stackoverflow 帖子(此處此處此處)將日志寫入project.log文件。

雖然信息在控制台中正確顯示,但正確讀取了log.conf ,創建了project.log但未填充警告消息。

這是我的處理方式:

用於編寫處理程序和格式的log.conf文件:

[loggers]
keys=root,sLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=fileFormatter,consoleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_sLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=sLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=WARNING
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=WARNING
formatter=fileFormatter
args=('%(logfilename)s', 'w')

[formatter_fileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

main.py文件中:

import logging
import logging.config

def main():

    logging.config.fileConfig(fname='./log.conf', 
                                defaults={'logfilename': 'project.log')}, 
                                disable_existing_loggers=False)
    logger = logging.getLogger(__name__)

    logger.warning('This is a message')

在我的module.py文件中:

import logging
logger = logging.getLogger(__name__)

logger.warning('Example of a warning message')

我發現了問題! 我沒有意識到,但是在log.conf文件中定義handlers時,處理程序和格式化程序的順序很重要!

我將log.conf更改為:

[loggers]
keys=root,sLogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=consoleFormatter, fileFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler, fileHandler

[logger_sLogger]
level=DEBUG
handlers=consoleHandler, fileHandler
qualname=sLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=WARNING
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=WARNING
formatter=fileFormatter
args=('%(logfilename)s','a')

[formatter_fileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s


[formatter_consoleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

注意[formatters]部分中consoleFormatterfileHandler之間更改的順序。

rest 工作正常。

為了更容易玩,我把它放在 function 中(我想這可能是多余的):

def base_logger(path_conf, fname, savedir):
    '''
    Base logging function to be started once
    in the main script then used in every other
    modules.

    Args:
        - path_conf: str, path to the configuration
        file {log.conf}
        - fname: str, name of the saved log file
        - savedir: str, path of the saving directory

    Returns:
        - logging object to be used in the other scripts

    Example:
        In main.py:
            main():
                base_logger(paht_cong = './log.conf', fname='file', savedir='project)
        
        In module.py:
            # AFTER all the import
            logger = logging.getLogger(__name__) # To ge the module name reported in the log file
            ...
            logger.error(f'Error message regarding variable {var}')

        The logger initialization {logger = logging.getLogger(__name__)},
         has to be done in every file that will use logging !

    '''
    logging.config.fileConfig(fname=path_conf,
                                defaults={'logfilename': os.path.join(savedir, f'{fname}.log')}, 
                                disable_existing_loggers=False)

我要補充一點, logger = logging.getLogger(__name__)必須放在所有imports之后,以確保日志中顯示的module名稱不是從其他模塊導入的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM