私は自分のプロジェクトに固有の汎用ロガーインスタンスを持っています。それは自動的に2つのハンドラ(StreamHandler
とTimedRotatingFileHandler
)を作成し、それらにあらかじめ設定された異なる書式などを付けて添付します。pythonプロジェクトでモジュール間でloggerインスタンスを共有する必要はありますか?
/
- app.py
- settings.py
- dir1/
- __init__.py
- mod1.py
- dir2/
- __init__.py
- mod2.py
私はpython app.py
を使用してサーバを起動します。
logging_formatters = {
'fmt': "%(asctime)s [%(levelname)8s:%(process)05d] [%(module)10s:%(lineno)03d] (%(name)s) %(message)s",
'datefmt': "%Y-%m-%d %H:%M:%S"
}
def get_logger(
application_name=None,
filename=None,
*args,
**kwargs
):
if not isinstance(application_name, str):
raise ValueError("Logger class expects a string type application name")
if filename is None:
filename = application_name
if not filename.endswith(".log"):
filename = filename.split('.')[0] + ".log"
log_path = kwargs.get('log_path')
service_name = kwargs.get('service_name', '')
console_level = kwargs.get('console_level', logging.INFO)
file_level = kwargs.get('file_level', logging.DEBUG)
logger = logging.getLogger(application_name)
if len(logger.handlers) > 0:
return logger
# Create 2 handlers, and add them to the logger created
# ...
# ...
# ...
さて、私のフラスコのプロジェクト構造を仮定のようなものです。 app.py
自体はdir1.mod1
とdir2.mod2
のモジュールをインポートします。以下のように、これらのモジュールの各々は、独自のロガーインスタンスを作成します。
logger = log_package.get_logger(
application_name='{}.{}'.format(settings.APPLICATION_NAME, __name__),
filename=settings.LOG_FILE_NAME,
service_name=settings.SERVICE_NAME,
)
をしてapp.py
の場合、それは次のようになります。
logger = log_package.get_logger(
application_name='{}.{}'.format(settings.APPLICATION_NAME, 'run'),
filename=settings.LOG_FILE_NAME,
service_name=settings.SERVICE_NAME,
)
さて、私が直面しています問題はそれです。 TimedRotatingFileHandler
はすべてのサブモジュール(つまり、dir1.mod1
、dir2.mod2
など)で正常に動作していますが、app.py
のログは新しいファイルにロールオーバーされません。その特定のインスタンスは、サービスが開始されたときと同じファイルにログを書き込んでいます。たとえば。 2017-07-11
でサービスを開始した場合、app.py
はログをLOG_FILE_NAME.log.2017-07-11
に書き込んだり、他のモジュールは毎日ロールオーバーします(when=midnight
)。新しいログはLOG_FILE_NAME.log
に書き込まれます。
TimedRotatingFileHandler
は特定のファイルでは機能しません。私は、ディレクトリ内のすべてのファイルのlsof
のコマンドを実行し、これが出力された:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 23795 ubuntu 4w REG 202,1 2680401 150244 /path/to/LOG_FILE_NAME.2017-07-12
python 23795 ubuntu 33w REG 202,1 397074 150256 /path/to/LOG_FILE_NAME.log
は、私はPythonのプロジェクトにモジュール間でロガーインスタンスを共有する必要がありますか?私はロギングモジュール自体がスレッドセーフであるため、これは必須ではないと思います。
私は自分の答えを更新しました。 –