web-dev-qa-db-ja.com

Python logging:存在しない場合はログを作成するか、存在する場合は開いてログを続行します

python loggingシステムを使用するコードを書いています。LOGがまだ存在しない場合、ログを作成しますが、次にログを取得し、そのファイルへのロギングを再開します。これが私のコードです。

import logging
import os

log_filename='Transactions.log')
if os.path.isfile(log_filename)!=True:
    LOG = logging.getLogger('log_filename')
    LOG.setLevel(logging.DEBUG)
    # create file handler which logs even debug messages
    fh = logging.FileHandler('log_filename')
    fh.setLevel(logging.DEBUG)
    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    # create formatter and add it to the handlers
    formatter = logging.Formatter('-->%(asctime)s - %(name)s:%(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    # add the handlers to the logger
    LOG.addHandler(fh)
    LOG.addHandler(ch)
else:
    LOG=logging.getLogger()

問題はelseブロックにあると思われますが、修正方法がわかりません。誰もがこの状況にいくつかの光を当てることができますか?.

12
CiaranWelsh

ロギングモジュールのFileHandlerがそれを処理します。複雑にする必要はありません。

ハンドラーはオプションのmodeパラメーターを受け取り、データの書き込みを開始するか、データの追加を開始するかを指定します。

the docs から:

class logging.FileHandler(filename, mode='a', encoding=None, delay=False)

指定されたファイルが開かれ、ロギングのストリームとして使用されます。 modeが指定されていない場合、'a' 使用されている。

13
hjpotter92

@mightypileが言及したように、logs/mylogfile.logのような新しいディレクトリ構造を作成しようとした人にとっては、FileHandlerは新しいディレクトリ構造を作成しません。ディレクトリ構造を確保するためにos.makedirsを使用しました。

import os
import logging

log_filename = "logs/output.log"
os.makedirs(os.path.dirname(log_filename), exist_ok=True)
file_handler = logging.FileHandler(output_filename, mode="w", encoding=None, delay=False)
5
lotrgollum87

あなたが走るとき

LOG = logging.getLogger('log_filename')

初めてグローバル変数が作成されます。したがって、次のコードを上記のスクリプトに追加することもできます。

global LOG
if LOG is not None:
    print("found logger !")
else:
    ("no global variable logger found")
0
Angelo