2

Pythonプログラムでロギングを処理する次の方法があります

def createLogger(logger, logLang):
    """
    Setting up logger
    """
    log_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    file_handler = logging.FileHandler(filename=(os.path.join(OUT_DIR_LOGS, logLang + '-userdynamics.log')))
    file_handler.setFormatter(log_format)
    logger.setLevel(logging.INFO)
    logger.addHandler(file_handler)

これは大規模なデータ収集コード ベースであり、リモート サーバーでのクォータの制約を回避するために、次の gzip および tar 手順を実装しました。

def gzipLogs(lang):
    """
    Compressing and tar
    """
    # Compressing logfiles and removing the old logfile
    original_filePath = OUT_DIR_LOGS + "/" +lang + "-userdynamics.log"
    gzip_filePath = OUT_DIR_LOGS + "/" + lang +"-userdynamics.gz"
    with open(original_filePath , 'rb') as original_file:
        with gzip.open(gzip_filePath, 'wb') as zipped_file:
            zipped_file.writelines(original_file)
    os.remove(original_filePath)
    # Compressing language folders that has data
    folder_path = OUT_DIR + "/" + lang
    tar_file = tarfile.open(folder_path + ".tgz", "w:gz")
    # add timestamp to arch file
    tar_file.add(folder_path, arcname = NOW + "_" + lang)
    tar_file.close()
    # delete the original file
    shutil.rmtree(folder_path)

ネストされた for ループでデータ収集プロセスを実行し、次のようにロガーを呼び出します。

for something in somethings:
    for item in items:
        log = logging.getLogger()
        # Calling the logging configuration function.
        createLogger(log, lang)

すべて正常に動作しますが、実行されると、ファイル .nsf ファイルを削除した後、残りのファイルが残り、クォータの問題がそのまま残ります。

そのため、次のコード セグメントを追加してログ ファイル ハンドラを閉じましたが、これで次のエラーが発生します。

ログ ファイルを閉じるコード:

unclosed_logs = list(log.handlers)
for uFile in unclosed_logs:
    print uFile
    log.removeHandler(uFile)
    uFile.flush()
    uFile.close()

上記のコードは、私にこのエラーを与えてしまいます:

Traceback (most recent call last):
  File "/somefilepath/SomePythonFile.py", line 529, in <module>
    main()
  File "/somefilepath/SomePythonFile.py", line 521, in main
    gzipLogs(lang)
  File "/somefilepath/SomePythonFile.py", line 61, in gzipLogs
    with gzip.open(gzip_filePath, 'wb') as zipped_file:
AttributeError: GzipFile instance has no attribute '__exit__'

これは、ハンドラーのコード セグメントを閉じると、main メソッドがどのように見えるかです。

for something in somethings:
    for item in items:
        log = logging.getLogger()
        # Calling the logging configuration function.
        createLogger(log, lang)
    unclosed_logs = list(log.handlers)
    for uFile in unclosed_logs:
        print uFile
        log.removeHandler(uFile)
        uFile.flush()
        uFile.close()

私は何を間違っていますか?ロガーの扱いが間違っていますか?または、ファイルを閉じるのが早すぎますか?

4

2 に答える 2

1

問題を引き起こす可能性のある多くのことがあります。

  1. ログの設定 (レベルの設定、ハンドラーの追加など) は、プログラム内の 1 か所 (理想的にはif __name__ == '__main__'句から) でのみ行う必要があります。あなたはこれをしていないようです。WatchedFileHandler外部ローテータを使用してログ ファイルをローテーションできることに注意してください。たとえば、 logrotateはローテーションおよび圧縮機能を提供します。
  2. 関連するエラー__exit__はロギングとは関係ありません-おそらくPythonのバージョンの問題に関連しています。GZipFilePython 2.7 / 3.2 でのみ使用可能になりました。古いバージョンでは、ステートメントで awithを使用しようとするとエラー メッセージが表示されます。GZipFilewith
于 2013-03-13T12:08:23.427 に答える
0

いくつかの調査の後、ファイルを実行していたサーバーが python 2.6 に対して実行されていて、2.6 では GZip モジュールにwith open. この質問に答えるには、python 2.7 に切り替えるか、try catch ブロックで実装を昔ながらのファイル オープン ファイルに変更します。

try:
    inOriginalFile = open(original_filePath, 'rb')
    outGZipFile = gzip.open(gzip_filePath, 'wb')
    try:
        outGZipFile.writelines(inOriginalFile)
    finally:
        outGZipFile.close()
        inOriginalFile.close()
except IOError as e:
    logging.error("Unable to open gzip files, GZIP FAILURE")

これが私がこの問題を修正した方法です。

于 2013-03-18T23:14:54.077 に答える