2016-11-30 5 views
1

エラーレベルのログを記録するメソッドの引数をログに挿入したいと思います。エラーログをPythonで伝播するメソッド引数でオーバーライドする方法は?

私はこの質問を見て、私は検査ライブラリはメソッドの引数を取得するには良い選択かもしれないと思う:理想的に私は上記のみを追加するコードを検査呼び出すしたいと思いますけれどもGetting method parameter names in python

import inspect 

def add(x,y): 
    frame = inspect.currentframe() 
    try: 
     print(frame.f_locals) 
    finally: 
     del frame 
    return x+y 

Running: add(4,5) 
Returns: {'frame': , 'y': 5, 'x': 4} 

をエラーレベルへの情報は自動的にログされ、何らかの形でエラーログを上書きするときにのみ記録されます。

答えて

1

これは興味深い質問です。基本的に次のことができますようにラッパー関数の外観を作るために使用functools.wrapshere

  • を説明するように、デフォルトlogging.error機能を上書きする新しいerror機能

  • から呼び出し側のフレームを取得する

    結果は次のようになります。今

    from functools import wraps 
    import logging 
    import inspect 
    
    # save the old logging.error function 
    __logging_error = logging.error 
    
    @wraps(logging.error) 
    def error(msg, *args, **kwargs): 
        __logging_error(msg, *args, **kwargs) 
        caller = inspect.stack()[1] 
        caller_frame = caller[0] 
        __logging_error('args: %s' % caller_frame.f_locals) 
    
    # overwrite the default logging.error 
    logging.error = error 
    

    コード:

    def add(x, y): 
        logging.error('this is an error') 
        return x + y 
    
    add(4, 5) 
    

    出力:答えを

    ERROR:root:this is an error 
    ERROR:root:args: {'y': 5, 'x': 4} 
    
  • +0

    おかげで、あなたのコードはRecursionErrorを投げるが、バックでステッピングされスタックは私の問題のための簡単な解決策です。 – swartchris8

    +0

    @chrisvlll:これは興味があり、私には何も投げられません。ここでスクリプト全体を試してみてください:https://gist.github.com/enricobacis/83ca7bf163b27e95eb2828e0756f8cc –

    +0

    謝罪ipythonで複数回実行しましたが、サルパッチのためにRecursionError – swartchris8

    関連する問題