4

コードのロガーを使用して、Django プロジェクトから Fluentd ログ ハンドラーを設定しようとしています。

def get_fluentd_logger(name):
    import logging
    from fluent import handler

    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(name)
    logger.addHandler(handler.FluentHandler(name, host='localhost', port=24224))
    return logger

handler.FluentHandlerパッケージから来て、ローカルでfluent-logger実行しています。fluent

流暢な.conf:

<source>
  type forward
  port 24224
</source>

<match **>
  type copy
  <store>
        type stdout
  </store>

  <store>
          type forward
          send_timeout 60s
          recover_wait 10s
          heartbeat_interval 1s
          phi_threshold 8
          hard_timeout 60s

          <server>
            name monitoring
            host 1.2.3.4
            port 24224
            weight 100
          </server>
  </store>
</match>

これを django 以外の python プロジェクトから実行すると正常に動作しますが、django から呼び出すと何もしません。

問題は、現在インストールされているロガーとそのハンドラーを確認して、この状況をデバッグできる方法はありますか?

[編集]

次のようなdjango設定から行うと:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(levelname)s: %(message)s'
        },
    },
    'handlers': {
       'fluentdebug':{
            'level':'DEBUG',
            'class':'fluent.handler.FluentHandler',
            'formatter': 'simple',
            'tag':'foo.bar.baz',
            'host':'localhost',
            'port':24224,
        },
    },
    'loggers': {
        'foo.bar.baz': {
            'handlers': ['fluentdebug'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

それは機能します。ただし、コードからこれを実行できるようにしたいと考えています。これは、foo.bar.baz多くの値を取ることができ、まったく同じことを行う 20 個のロガーとハンドラーでこのファイルを汚染したくないためです。

loggingおそらく本当の問題は、Django がセットアップを実行した後にコードからロガーを追加できないのはなぜですか?

4

2 に答える 2

3

誰かが同じ問題を抱えていると見つけやすいので、私は自分自身に答えるつもりです。問題はにあるようFluentHandlerです。@Thomasが言及したBrandonのロギングツリーを使用すると、ロガーが正しく追加されていることがわかりました。

ただし、さらにデバッグすると、ログレベルを明示的に設定しない場合はに設定されることがわかりましたNotSet。どういうわけか「普通の」Pythonではこれは問題なく、レコードが発行されます。ただし、DjangoではNotSetレベルログは破棄されます。これが標準的なDjangoの動作であるかどうかはわかりませんが、多くの問題が発生しました。動作したコードは次のとおりです。

def get_fluentd_logger(name):
    import logging
    from fluent import handler

    logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(name)
    logger.level = logging.INFO
    handler = handler.FluentHandler(name, host='localhost', port=24224)
    handler.level = logging.INFO
    logger.addHandler(handler)
    return logger
于 2012-11-20T09:25:33.940 に答える
3

これは私が以前に扱ったものではありませんが、Logging Treeはあなたが探しているもののように思えます。これについてはBrandon の投稿を読む必要がありますが、出力の例を次に示します。

<--""
   Level WARNING
   Handler Stream <open file '<stderr>', mode 'w' at ...>
   |
   o<--[cherrypy]
       |
       o<--"cherrypy.access"
       |   Level INFO
       |   Handler Stream <open file '<stdout>', mode 'w' ...>
       |
       o<--"cherrypy.error"
           Level INFO
           Handler Stream <open file '<stderr>', mode 'w' ...>
于 2012-11-17T07:24:55.163 に答える