2016-03-26 24 views
0

私はメインフローとサブモジュールから同じファイルにログを記録しようとしている:Pythonのモジュール構造とロギング

/proxy 
/proxy/proxy/network.py 
/proxy/proxy.py 

network.py:

import logging 
print __name__ 
... 

logging.getLogger(__name__).warning("test warn") 

proxy.py:

import logging 
print __name__ 
logging.basicConfig(filename="console", format="%(message)s", disable_existing_loggers=False) 
logging.warning("test main") 

私はproxy.pyの作業でログインしていますが、network.pyではそうではありません。なぜなら明らかに彼らのという名前がは次のとおりです。

proxy.network 
__main__ 

respecitvelyです。私は同じフォルダに置く場合

その名前は次のようになります:

network 
__main__ 

も動作しないでしょう。私のプロジェクトルートはproxy.py(どこにあっても)に対して1つ上のレベルであると何とか言っておかなければならないようです。この場合、両方とも "proxy。*"という名前になります。

プロジェクトのルートフォルダをインタープリタに向けるにはどうすればいいですか? ロギングを有効にするには(どちらのモジュール構造でも)モジュール構造名を統一する方法は?同じファイルにすべてのログ情報を保存する

答えて

1

最も簡単な方法はある、(のgetLoggerのパラメータを提供しない)[代わりに、あなたが今使っているものの、のgetLogger()]

しかし、その心に留めておきますロギングを使用する他のモジュールを使用している場合(あなたのプロジェクトの外で、おそらくhttplibのような第三者)、この方法でログファイルにデータを保存する可能性があります。

1

EDIT:ここにファイル名へのアクセスです全体パッケージに関する:

filepath = __file__ if __name__ == '__main__' else __name__ 
次のような構造のために

、それが得られます。ここでは

mypack 
├── __main__.py # -> mypack.__main__ 
└── sub 
    ├── __init__.py 
    └── sub.py # -> mypack.sub.sub 

は抜粋です:

def logger(name=None, root_name=PACKAGE_NAME): 
    if name: 
     return logging.getLogger(root_name + '.' + name) 
    else: 
     return logging.getLogger(root_name) 

私は通常のすべてのモジュールによってインポートcommons.pyまたはutils.py、この関数を定義します私のパッケージ。

import utils 
logger = utils.logger() 
logger.info('module xxx started') 

または特定の概念に捧げsublogger:

import utils 
logger = utils.logger('vm') 
logger.info('module vm.xxx started') 

ファイルパスsubloggerシステムを利用して

は、このパッケージは、パッケージの主なロギングを使用することができますロギング設定がデカップリングされ、明示的にバインドされます。 モジュールごとに自動化することができ:

import utils 
logger = utils.logger(__file__) 
logger.info('module ' + __file__ + ' started') 

subloggerシステムの、ロガー「pk.vmは」(デフォルトでは)「PK」構成のために継承しますので、それは同じハンドラを使用して言うことです、同じロギングファイルに書き込むことができます。 はしかし、それはどのsubloggerのためのいくつかの特定の動作やハンドラを定義することが有用であることができます。

logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s', 
     }, 
     'simple': { 
      'format': '%(levelname)s %(message)s', 
     }, 
    }, 
    'handlers': { 
     'console':{ 
      'level':LOG_LEVEL, 
      'class':'logging.StreamHandler', 
      'formatter': 'simple', 
     }, 
     'logfile': { 
      'level': LOG_LEVEL, 
      'class': 'logging.handlers.RotatingFileHandler', 
      'filename': DIR_LOGS + LOGGER_NAME + '.log', 
      'mode': 'w', 
      'maxBytes': LOGFILE_MAX_SIZE, 
      'formatter': 'verbose', 
     }, 
     'logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: { 
      'level': LOG_LEVEL, 
      'class': 'logging.handlers.RotatingFileHandler', 
      'filename': DIR_LOGS + LOGGER_NAME + '.' + SUBLOGGER_VM + '.log', 
      'mode': 'w', 
      'maxBytes': LOGFILE_MAX_SIZE, 
      'formatter': 'verbose', 
     }, 
    }, 
    'loggers': { 
     PACKAGE_NAME: { 
      'handlers':['console', 'logfile'], 
      'propagate': True, 
      'level':LOG_LEVEL, 
     }, 
     PACKAGE_NAME + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: { 
      'handlers':['logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM], 
      'level':LOG_LEVEL, 
     }, 
    } 
}) 
+0

動作しますが、何を__nameの使用について言うことができ__さんは、モジュール構造を反映すべきか?異なる答え/マニュアルでは、彼らは常に "network.pyはproxy.py(main.py)に比べてサブモジュールにあります"と言っていますが、ファイルの1つがトップレベルにある場合、これをどのように利用するのか分かりません。 – VladimirLenin

+0

これまで見てきたように、モジュールはパッケージアーキテクチャのどこにいるのかを知る必要があります。これはおそらく良い解決策ではありません。 – aluriak

+0

私は自分の答えを編集しました:\ __ name__と\ __ file__は、アーキテクチャ内のファイルの場所を取得するために使用できます。 – aluriak

関連する問題