私はPythonを初めて使用し、1つのプロジェクトを開始したばかりです。log4j
をJavaで使用するのに慣れており、すべてのモジュールとPythonのクラスは、Javaの場合と同じです。
Javaの場合、以下のようにlog4j.properties
という名前のsrcフォルダーに1つのログ構成ファイルがあります。
log4j.rootLogger=DEBUG, Console, fileout
log4j.appender.Console=org.Apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.Apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %5p [%t] (%F:%L) - %m%n
log4j.appender.fileout=org.Apache.log4j.RollingFileAppender
log4j.appender.fileout.File=servidor.log
log4j.appender.fileout.layout=org.Apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} (%F:%L) %p %t %c - %m%n
コンソールとファイルに記録します。
私のクラスでは、log4j
をインポートして静的属性を追加するだけで、設定をロードしてlog4j
ロガーをリカバリできます。そうすると、すべてのクラスがコンソールとファイルにログインします。構成ファイルは名前で自動的にロードされます。例えば:
import org.Apache.log4j.Logger;
public class Main {
public static Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.info("Hello");
}
}
現在、Pythonでのロギングの設定に問題があります。ドキュメントを読みましたが、多くのモジュール/クラスでそれを使用する方法を見つけることができませんでした。 Python簡単な方法でログを記録して、すべてのモジュール/クラスにコードなしでモジュールとクラスをログに記録するにはどうすればよいですか?Pythonで記述したのと同じコードを再現することは可能ですか?
実際にはPythonのように見えます。これは非常によく似ています。それを行う方法はいくつかあります。通常、非常に単純なロガークラスを作成します。
import os
import logging
import settings # alternativly from whereever import settings
class Logger(object):
def __init__(self, name):
name = name.replace('.log','')
logger = logging.getLogger('log_namespace.%s' % name) # log_namespace can be replaced with your namespace
logger.setLevel(logging.DEBUG)
if not logger.handlers:
file_name = os.path.join(settings.LOGGING_DIR, '%s.log' % name) # usually I keep the LOGGING_DIR defined in some global settings file
handler = logging.FileHandler(file_name)
formatter = logging.Formatter('%(asctime)s %(levelname)s:%(name)s %(message)s')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
self._logger = logger
def get(self):
return self._logger
次に、クラスまたはモジュールに何かを記録したい場合は、ロガーをインポートしてインスタンスを作成するだけです。クラス名を渡すと、クラスごとに1つのファイルが作成されます。ロガーは、デバッグ、情報、エラーなどを介してファイルにメッセージを記録できます。
from module_where_logger_is_defined import Logger
class MyCustomClass(object):
def __init__(self):
self.logger = Logger(self.__class__.__name__).get() # accessing the "private" variables for each class
def do_something():
...
self.logger.info('Hello')
def raise_error():
...
self.logger.error('some error message')
長年にわたり、私はPythonロギングをかなり使用している方法を変更しました。主に良い習慣に基づいて、アプリケーションの起動時に最初にロードされたモジュールにアプリケーション全体のロギングを設定し、次に、各ファイルで個別のロガーを使用します。例:
# app.py (runs when application starts)
import logging
import os.path
def main():
logging_config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default_handler': {
'class': 'logging.handlers.FileHandler',
'level': 'DEBUG',
'formatter': 'standard',
'filename': os.path.join('logs', 'application.log'),
'encoding': 'utf8'
},
},
'loggers': {
'': {
'handlers': ['default_handler'],
'level': 'DEBUG',
'propagate': False
}
}
}
logging.config.dictConfig(logging_config)
# start application ...
if __name__ == '__main__':
main()
# submodule.py (any application module used later in the application)
import logging
# define top level module logger
logger = logging.getLogger(__name__)
def do_something():
# application code ...
logger.info('Something happended')
# more code ...
try:
# something which might break
except SomeError:
logger.exception('Something broke')
# handle exception
# more code ...
上記はこれを行うための推奨方法です。各モジュールは独自のロガーを定義し、__name__
属性に基づいて、ログを検査すると、どのモジュールにどのメッセージが記録されたかを簡単に識別できます。これにより、ボイラープレートが元の回答から削除され、代わりにPython標準ライブラリのlogging.config
モジュールが使用されます。
ドキュメント ロガーを複数のモジュールで使用するかなり良い例を提供します 。基本的に、プログラムの開始時に一度ログを設定します。次に、ログを記録したい場所にログモジュールをインポートして使用します。
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
import logging
def do_something():
logging.info('Doing something')
この例は非常に単純なロガーの設定を示していますが、 ロギングを設定するさまざまな方法 を使用して、より高度なシナリオを簡単に設定できます。