11

私のPythonプログラムには、次のコードがあります。

def main():
    # The file's path
    path = os.path.dirname(os.path.realpath(__file__))
    ...
    # Config file relative to this file
    loggingConf = open('{0}/configs/logging.yml'.format(path), 'r')
    logging.config.dictConfig(yaml.load(loggingConf))
    loggingConf.close()
    logger = logging.getLogger(LOGGER)
    ...

これは私の logging.yml 構成ファイルです。

version: 1
formatters:
  default:
    format: '%(asctime)s %(levelname)s %(name)s %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: default
    stream: ext://sys.stdout
  file:
    class : logging.FileHandler
    formatter: default
    filename: bot.log
loggers:
  cloaked_chatter:
    level: DEBUG
    handlers: [console, file]
    propagate: no

問題は、プログラムが起動された場所に bot.log ファイルが作成されることです。常にプロジェクトのフォルダー、つまり Python プログラムと同じフォルダーに作成する必要があります。

たとえば、でプログラムを起動すると./bot.py、同じフォルダーにログ ファイルが作成されます。しかし、それを起動するとpython3 path/bot.py、ファイル階層の Python プログラムより上のレベルにログ ファイルが作成されます。

これを解決するには、設定ファイルにファイル名をどのように記述すればよいですか? または、カスタム ハンドラーを作成する必要がありますか? もしそうなら、どのように?それとも、これは dictConfig を使用して解決することはできませんか?

4

1 に答える 1

14

あなたが望むものを達成する方法はたくさんあります。たとえば、1 つの方法は、ハンドラーのカスタム初期化子を作成することです。

import os
import yaml

def logmaker():
    path = os.path.dirname(os.path.realpath(__file__))
    path = os.path.join(path, 'bot.log')
    return logging.FileHandler(path)

def main():
    # The file's path
    path = os.path.dirname(os.path.realpath(__file__))

    # Config file relative to this file
    loggingConf = open('{0}/logging.yml'.format(path), 'r')
    logging.config.dictConfig(yaml.load(loggingConf))
    loggingConf.close()
    logger = logging.getLogger('cloaked_chatter')
    logger.debug('Hello, world!')

if __name__ == '__main__':
    main()

logging.ymlスクリプトに隣接するように移動したことに注意してください。はlogmakerカスタム初期化子です。YAML で次のように指定します。

version: 1
formatters:
  default:
    format: '%(asctime)s %(levelname)s %(name)s %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: default
    stream: ext://sys.stdout
  file:
    () : __main__.logmaker
    formatter: default
loggers:
  cloaked_chatter:
    level: DEBUG
    handlers: [console, file]
    propagate: no

Python スクリプトを実行bot.logすると、スクリプトと YAML ファイルに隣接して が作成されていることがわかります。同じメッセージがコンソールに出力され、次のようになりbot.logます。

2013-04-16 11:08:11,178 DEBUG cloaked_chatter Hello, world!

注: スクリプトはもう少し整頓されている可能性がありますが、それは私の要点を示しています。

更新: documentationに従って、辞書のキーとしての使用は()、値が本質的にハンドラーのカスタム コンストラクターである呼び出し可能であることを示します。

于 2013-04-16T10:15:00.003 に答える