【问题标题】:rename a log file in python using a logging module使用日志记录模块重命名python中的日志文件
【发布时间】:2014-10-21 05:58:00
【问题描述】:

我需要重命名一个日志文件,但之后继续记录它。我正在运行 Python 3.x 并使用 logging 模块创建日志。

logger = logging.getLogger(r'mylogger')
handler = logging.FileHandler(r'mylog.txt', mode = r'w')
logger.addHandler(handler)
logger.info(r'msg 1')
logger.info(r'msg 2')

handler.renameFile(r'my_newlog.txt')  # <--- Is something like this possible?

logger.info(r'msg 3')

有谁知道这样的事情是否可行?如果没有,我将如何去做?我的一个想法是关闭文件(handler.close()),从记录器中删除处理程序,重命名旧文件,使用新文件名创建一个新处理程序并将其添加到记录器。然而问题是我需要创建一个完全相同的处理程序,即它需要具有与旧处理程序相同的属性(当然文件名除外)。有没有一种简单的方法来存储旧属性,然后使用它们来设置新处理程序的属性?

感谢任何帮助。

【问题讨论】:

    标签: logging python-3.x


    【解决方案1】:

    我遇到了同样的问题,并且对 JS 建议的解决方案几乎没有修改就成功了

    #!/usr/bin/env python3
    
    import os
    import logging
    import shutil
    
    logger_name1 = 'my_log.txt'
    logger_name2 = 'my_new_log.txt'
    
    logger = logging.getLogger('mylogger')
    logger.level = logging.INFO
    handler = logging.FileHandler(logger_name1, mode='w')
    logger.addHandler(handler)
    logger.info('msg 1')
    logger.info('msg 2')
    
    # handler.renameFile('my_newlog.txt')  # <--- Is something like this possible?
    handler.close()     # need to close to release file handle
    logger.removeHandler(handler)
    
    # Rename the logfile on disk
    #os.rename(logger_name1, logger_name2) # error if destination already exists
    shutil.move(logger_name1, logger_name2)
    
    # New handler using new filename.  Note the 'append' flag
    new_handler = logging.FileHandler(logger_name2, mode='a')
    logger.addHandler(new_handler)
    
    # Try out the new logfile
    logger.info('msg 3')
    

    【讨论】:

      【解决方案2】:

      聚会迟到了,但我也遇到了这个问题,这就是我(暂时)解决它的方法。不过需要更多测试。

      请注意,在我的例子中,我确实可以访问前一个处理程序,所以我只是使用了我之前使用的相同处理程序配置。我同意 FileHandler.'rename_file()' 方法会很棒。一个可能通过子类化 FileHandler() 来完成,但这是另一天的练习。

      #!/usr/bin/env python3
      
      import os
      import logging
      
      logger_name1 = 'my_log.txt'
      logger_name2 = 'my_new_log.txt'
      
      logger = logging.getLogger('mylogger')
      logger.level = logging.INFO
      handler = logging.FileHandler(logger_name1, mode='w')
      logger.addHandler(handler)
      logger.info('msg 1')
      logger.info('msg 2')
      
      # handler.renameFile('my_newlog.txt')  # <--- Is something like this possible?
      
      logger.removeHandler(handler)
      
      # Rename the logfile on disk
      os.rename(logger_name1, logger_name2)
      
      # New handler using new filename.  Note the 'append' flag
      new_handler = logging.FileHandler(logger_name2, mode='a')
      logger.addHandler(new_handler)
      
      # Try out the new logfile
      logger.info('msg 3')
      

      【讨论】:

        【解决方案3】:
        import glob
        import logging
        import logging.handlers
        
        LOG_FILENAME = 'logging_rotatingfile_example.out'
        
        # Set up a specific logger with our desired output level
        my_logger = logging.getLogger('MyLogger')
        my_logger.setLevel(logging.DEBUG)
        
        # Add the log message handler to the logger
        handler = logging.handlers.RotatingFileHandler(
                      LOG_FILENAME, maxBytes=20, backupCount=5)
        
        my_logger.addHandler(handler)
        
        # Log some messages
        for i in range(20):
            my_logger.debug('i = %d' % i)
        
        # See what files are created
        logfiles = glob.glob('%s*' % LOG_FILENAME)
        
        for filename in logfiles:
            print(filename)
        

        结果应该是 6 个单独的文件,每个文件都包含应用程序的部分日志历史记录:

        logging_rotatingfile_example.out
        logging_rotatingfile_example.out.1
        logging_rotatingfile_example.out.2
        logging_rotatingfile_example.out.3
        logging_rotatingfile_example.out.4
        logging_rotatingfile_example.out.5
        

        【讨论】:

          猜你喜欢
          • 2020-08-11
          • 1970-01-01
          • 2017-06-04
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-18
          相关资源
          最近更新 更多