使用静态类时Python崩溃

时间:2014-08-09 13:07:36

标签: python logging file-io locked-files

我在Python中迈出了第一步,并且已经到了需要记录模块的地步。我没有选择旋转文件处理程序的原因是:

  1. 我想在每次运行代码时创建一个新文件夹,托管新的日志文件。
  2. 使用传统文件名(myName_X.log,而非默认myName.log.X)。
  3. 按行数限制日志文件,而不是文件大小(由旋转文件处理程序完成)。
  4. 我使用Python的内置日志记录模块编写了这样一个模块,但我有两个问题:

    1. 创建新文件夹和文件,并将日志记录数据打印到文件中。但是,当第二次运行main()时(请参阅下面的代码),新创建的文件将被锁定,并且无法从文件资源管理器中删除,除非我关闭IDE或通过Process Explorer释放锁定。
    2. 第二次运行main()时,IPython解释器会冻结。如果我尝试pdb模块,它也会冻结。
    3. 我正在使用WinPython 3.3.5(使用Spyder 2.3.0beta)。我花了几个小时试图找到解决这个问题的方法。我不知道这是我的代码中的问题,还是Spyder的错误。

      欢迎提供一般编码备注。

      main_example.py

      import myLogging
      
      
      def main():
      
          try:
              myLoggerInstance = myLogging.MyLogger()
      
      
              # Do stuff...
      
      
              # logging example
              for i in range(0, 3):
                  msg = 'Jose Halapeno on a stick {0}'.format(i)
                  myLoggerInstance.WriteLog('DEBUG', msg)
              print('end of prints...')
      
      
          finally:
              myLoggerInstance._closeFileHandler()
              print('closed file handle...')
      
      
      if __name__ == "__main__":
          main()
      

      myLogging.py

      import logging
      import time
      import os
      
      
      class MyLogger:
          _linesCounter = 0
          _nNumOfLinesPerFile = 100000
          _fileCounter = 0
          _dirnameBase = os.path.dirname(os.path.abspath(__file__))
          _dirname = ''
          _filenameBase = 'logfile_{0}.log'
          _logger = logging.getLogger('innerGnnLogger')
          _severityDict = {'CRITICAL' : logging.CRITICAL, 'ERROR': logging.ERROR, 'WARNING':         
          logging.WARNING, 'INFO': logging.INFO, 'DEBUG': logging.DEBUG}
      
      
          @staticmethod
          def __init__():
              # remove file handle
              MyLogger._closeFileHandler()
      
              # create folder for session
              MyLogger._dirname = MyLogger._dirnameBase + time.strftime("\\logs_%Y_%m_%d-    
              %H_%M_%S\\")
              MyLogger._dirname = MyLogger._dirname.replace('\\\\', '/')
              if not os.path.exists(MyLogger._dirname):
                  os.makedirs(MyLogger._dirname)
      
              # set logger
              MyLogger._logger.setLevel(logging.DEBUG)
      
      
              # create console handler and set level to debug
              MyLogger._hConsole = logging.StreamHandler()
              MyLogger._hFile = logging.FileHandler(MyLogger._dirname + \
                  MyLogger._filenameBase.format(MyLogger._fileCounter))
              MyLogger._hConsole.setLevel(logging.WARNING)
              MyLogger._hFile.setLevel(logging.DEBUG)
      
              # create formatter
              MyLogger._formatter = logging.Formatter('%(asctime)s %(filename)s, %(funcName)s, %(lineno)s, %(levelname)s: %(message)s')
      
              # add formatter to handlers
              MyLogger._hConsole.setFormatter(MyLogger._formatter)
              MyLogger._hFile.setFormatter(MyLogger._formatter)
      
              # add handlers to logger
              MyLogger._logger.addHandler(MyLogger._hConsole)
              MyLogger._logger.addHandler(MyLogger._hFile)
      
      
          @staticmethod
          def _StartNewFileHandler():
      
              MyLogger._closeFileHandler()
      
              # create new file handler
              ++MyLogger._fileCounter
              MyLogger._hFile = logging.FileHandler(MyLogger._dirname + \
                  MyLogger._filenameBase.format(MyLogger._fileCounter))
              MyLogger._hFile.setLevel(logging.DEBUG)
              MyLogger._hFile.setFormatter(MyLogger._formatter)
              MyLogger._logger.addHandler(MyLogger._hFile)
      
      
          @staticmethod
          def WriteLog(severity, message):
              if (len(MyLogger._logger.handlers) < 2):
                  MyLogger._StartNewFileHandler()
              MyLogger._linesCounter += 1
              MyLogger._logger.log(MyLogger._severityDict[severity], message)
              if (MyLogger._linesCounter >= MyLogger._nNumOfLinesPerFile):
                  MyLogger._logger.info('Last line in file')
                  MyLogger._StartNewFileHandler()
                  MyLogger._linesCounter = 0
      
      
          @staticmethod
          def _closeFileHandler():
              if (len(MyLogger._logger.handlers) > 1):
                  MyLogger._logger.info('Last line in file')
                  MyLogger._logger.handlers[1].stream.close()
                  MyLogger._logger.removeHandler(MyLogger._logger.handlers[1])
      

0 个答案:

没有答案