12

Flask フレームワークで標準の Python ロギング モジュールを使用しています。カスタムパラメータ %(username)s to logging.Formatter を使用して、ユーザーアクションのすべてのレコードを含むログをファイルに書き込みたい:

admin - 2013-10-11 15:11:47,033 action0
user1 - 2013-10-11 15:11:48,033 action1
user2 - 2013-10-11 15:11:49,033 action2
admin - 2013-10-11 15:11:50,033 action3

RotatingFileHandler を使用しています:

def get_user_name():
    return session.get("username", "")

file_handler = RotatingFileHandler(fname, maxBytes=1 * 1024 * 1024, backupCount=5)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(
    '%(username)s - %(asctime)s %(levelname)-10s %(message)s  [in %(pathname)s:%(lineno)d]'
)) # how to insert get_user_name() instead %(username)s?

app.logger.addHandler(file_handler)

そのようなロガーを行う正しい方法は何ですか? ありがとう。

4

2 に答える 2

17

あなたはlogging.LoggerAdapterでそれを行うことができます

myLogger = logging.LoggerAdapter(logging.getLogger("my-logger"), {"username" : get_user_name()})

これがあなたのプログラムの完全な解決策です。dict を使用して構成を構築します。より多くのロガーがある場合は、より良いです

    def get_user_name():
        return session.get("username", "")

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'my_format': {
                'format': '%(username)s - %(asctime)s %(levelname)-10s %(message)s  [in %(pathname)s:%(lineno)d]'
            },
        },
        'handlers': {
            'my_handler': {
                'level': 'DEBUG',
                'class': 'logging.handlersRotatingFileHandler',
                'filename': fname,
                'maxBytes': 1 * 1024 * 1024,
                'backupCount': 5,
            },
        },
        'loggers': {
            'my_logger': {
                'handlers': ['my_handler'],
                'propagate': True,
                'level': 'DEBUG',
            },
        } }

logging.config.dictConfig(LOGGING) 
logging.LoggerAdapter(logging.getLogger('my_logger'),
                                           {"username" : get_user_name()})
于 2014-10-10T08:28:35.020 に答える