2017-01-30 151 views
0

我有一個實用的方法來做一些記錄。在記錄中覆蓋「funcName」

我想查看日誌中的調用方法名稱,而不是實用程序方法的名稱。

爲了測試我嘗試了這個(後來我想通過檢查模塊從調用者那裏得到「bar」)。

def helper(...): 
    logger.info('foo', extra=dict(funcName='bar')) 

但是,這並不工作:

File "/usr/lib/python2.7/logging/__init__.py", line 1167, in info 
    self._log(INFO, msg, args, **kwargs) 
    File "/usr/lib/python2.7/logging/__init__.py", line 1285, in _log 
    record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info, func, extra) 
    File "/usr/lib/python2.7/logging/__init__.py", line 1263, in makeRecord 
    raise KeyError("Attempt to overwrite %r in LogRecord" % key) 
KeyError: "Attempt to overwrite 'funcName' in LogRecord" 

這裏是輸出(如果我不嘗試在 「額外」 通過):

2017-01-30 15:00:24 loghelper.helper 

我想看到呼叫者:

2017-01-30 15:00:24 calling_module.calling_method 

這怎麼可能è?

更新

的方法名稱和其它數據被經由日誌記錄格式化器輸出:

logging.Formatter('%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s', 
            '%Y-%m-%d %H:%M:%S') 

回答

0

可以添加這將進一步調用logging方法的中間方法。

def autolog(message): 
    "Automatically log the current function details." 
    import inspect, logging 
    # Get the previous frame in the stack, otherwise it would 
    # be this function!!! 
    func = inspect.currentframe().f_back.f_code 
    # Dump the message + the name of this function to the log. 
    logging.debug("%s: %s in %s:%i" % (
     message, 
     func.co_name, 
     func.co_filename, 
     func.co_firstlineno 
    )) 
+0

感謝您調查如何通過檢查獲取方法名稱。問題是關於把這個名字寫入日誌輸出(通過日誌記錄,而不是通過打印)。 – guettli

+0

你可以顯示日誌功能的代碼片段嗎?或者你在使用內置模塊? – harshil9968

+0

func-name通過記錄Formater(不在我們的代碼中)輸出。我更新了這個問題。我認爲它不再顯示日誌功能的片段。你怎麼看? – guettli