0

私は Python で最初の一歩を踏み出しましたが、ロギング モジュールが必要なところまで来ました。ローテーション ファイル ハンドラーを選択しなかった理由は次のとおりです。

  1. コードを実行するたびに、新しいログ ファイルをホストする新しいフォルダーを作成したいと考えていました。
  2. 従来のファイル名を使用する (myName_X.logデフォルトではなくmyName.log.X)。
  3. ログ ファイルをファイル サイズではなく、行数で制限します (ローテーション ファイル ハンドラによって行われます)。

Python のビルトイン ロギング モジュールを使用してこのようなモジュールを作成しましたが、次の 2 つの問題があります。

  1. 新しいフォルダとファイルが作成され、ロギング データがファイルに出力されます。ただし、 をmain()2 回目に実行すると (以下のコードを参照)、新しく作成されたファイルはロックされ、IDE を閉じるか、プロセス エクスプローラーでロックを解除しない限り、ファイル エクスプローラーから削除できません。
  2. を 2 回目に実行すると、IPython インタープリターがフリーズしますmain()。モジュールを試してみると、pdb同様にフリーズします。

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])
4

0 に答える 0