簡體   English   中英

Python日志記錄創建額外的日志文件

[英]Python logging creating extra log files

我正在嘗試使用logging來為程序創建日志文件。 我正在做這樣的事情:

if not os.path.exists(r'.\logs'):
        os.mkdir(r'.\logs')

logging.basicConfig(filename = rf'.\logs\log_{time.ctime().replace(":", "-").replace(" ", "_")}.log',
                    format = '%(asctime)s %(name)s %(levelname)s %(message)s',
                    level = logging.DEBUG)

def foo():
        # do stuff ...
        logging.debug('Done some stuff')

        # do extra stuff ...
        logging.debug('Did extra stuff')

        # some parallel map that does NOT use logging in the mapping function
        logging.debug('Done mapping')


if __name__ == '__main__':
        foo()

一切順利,並且創建的日志中包含正確的信息:

logs
    log_Wed_Feb_14_09-23-32_2018.log

最后,出於某種原因,它還會創建2個其他日志文件,並將它們留空:

logs
    log_Wed_Feb_14_09-23-32_2018.log
    log_Wed_Feb_14_09-23-35_2018.log
    log_Wed_Feb_14_09-23-39_2018.log

時間戳僅相隔幾秒鍾,但是所有日志記錄仍然僅應按原樣進入第一個日志文件。

為什么這樣做呢? 除了在程序末尾刪除任何空日志之外,還有沒有辦法阻止它給我額外的空文件?

解決了。 的種類。

使用基本配置的行為一直在發生,因此我嘗試制作一個自定義記錄器類:

class Logger:
        """Class used to encapsulate logging logic."""
        __slots__ = ['dir',
                     'level',
                     'formatter',
                     'handler',
                     'logger']

        def __init__(self,
                     name: str = '',
                     logdir: str = r'.\logs',
                     lvl: int = logging.INFO,
                     fmt: str = '%(asctime)s %(name)s %(levelname)s %(message)s',
                     hdl: str = rf'.\logs\log_{time.ctime().replace(":", "-").replace(" ", "_")}.log'):

                print('construct')

                if not os.path.exists(logdir):
                        os.mkdir(logdir)

                self.dir = logdir

                self.level = lvl

                self.formatter = logging.Formatter(fmt = fmt)

                self.handler = logging.FileHandler(filename = hdl)
                self.handler.setFormatter(self.formatter)

                self.logger = logging.getLogger(name)
                self.logger.setLevel(self.level)
                self.logger.addHandler(self.handler)

        def log(self, msg: str):
                """Logs the given message to the set level of the logger."""
                self.logger.log(self.level, msg)

        def cleanup(self):
                """Iterates trough the root level of the log folder, removing all log files that have a size of 0."""
                for log_file in (rf'{self.dir}\{log}' for log in next(os.walk(self.dir))[2]
                                 if log.endswith('.log') and os.path.getsize(rf'{self.dir}\{log}') is 0):
                                os.remove(log_file)

        def shutdown(self):
                """Prepares and executes the shutdown and cleanul actions."""
                logging.shutdown()
                self.handler.close()
                self.cleanup()

並嘗試將其作為參數傳遞給以下函數:

def foo(logger = Logger('foo_logger')):

但是,這種方法使我每次調用log方法時都會構造一個全新的記錄器,該方法再次允許訪問多個文件。 通過使用Logger一個實例並將參數默認設置為None我解決了這種情況下多個文件的問題。

但是,最初的Basic Config情況仍然很混亂。

暫無
暫無

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

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