python - 按缩进或前缀长度显示日志上下文级别

标签 python logging formatting

我的想法是制作一个上下文日志记录方案,如下例所示:

[   DEBUG] Parsing dialogs files
[   DEBUG] ... [DialogGroup_001]
[   DEBUG] ...... Indexing dialog xml file [c:\001_dlg.xml]
[   DEBUG] ......... dialog [LobbyA]
[   DEBUG] ............ speech nodes [3]
[   DEBUG] ............... [LobbyA_01]
[   DEBUG] ............... [LobbyA_02]
[   DEBUG] ............... [LobbyA_03]
[   DEBUG] ............ sms nodes [0]
[   DEBUG] ......... dialog [LobbyB]
[   DEBUG] ............ speech nodes [3]
[   DEBUG] ............... [LobbyB_01]
[   DEBUG] ............... [LobbyB_02]
[   DEBUG] ............... [LobbyB_03]
[   DEBUG] ............ sms nodes [0]
[   DEBUG] ... [DialogGroup_002]
[   DEBUG] ...... Indexing dialog xml file [c:\002_dlg.xml]
[   DEBUG] ......... dialog [HighGroundsA]
[   DEBUG] ............ speech nodes [3]
[   DEBUG] ............... [HighGroundsA_01]
[   DEBUG] ............... [HighGroundsA_02]
[   DEBUG] ............... [HighGroundsA_03]
[   DEBUG] ............ sms nodes [0]

此时,我正在使用 Python 的日志记录模块,在记录日志时带有自定义的手写前缀,例如:

(...)

log.debug('')
log.debug('Parsing dialogs files')
for dlg in defDlgList:
    log.debug('... [{0}]'.format(dlg))

(...)

它工作得很好,但存在一些细微的问题,例如:当从函数内部记录时 - 它们可能会从不同的范围调用,并且每次调用的前缀长度可能会有所不同。

我正在寻找一种优雅且不可见的方式来自动为每个日志建立长度为“...”的前缀。我宁愿避免将前缀长度作为参数传递给每个函数或使用显式调用设置长度,例如:

(...)

logWrapper.debug('')
logWrapper.debug('Parsing dialogs files')
for dlg in defDlgList:
    logWrapper.nextLogLevelBegin()
    logWrapper.debug('[{0}]'.format(dlg))
    logWrapper.nextLogLevelEnd()

(...)

有没有办法从 Python 的解析器获取当前缩进级别或构造一个范围敏感的日志记录包装类?

最佳答案

也许你可以使用inspect.getouterframes查找缩进级别:

import inspect
import logging

logger=logging.getLogger(__name__)

def debug(msg):
    frame,filename,line_number,function_name,lines,index=inspect.getouterframes(
        inspect.currentframe())[1]
    line=lines[0]
    indentation_level=line.find(line.lstrip())
    logger.debug('{i} [{m}]'.format(
        i='.'*indentation_level,
        m=msg            
        ))

def foo():    
    debug('Hi Mom')
    for i in range(1):
        debug("Now we're cookin")

if __name__=='__main__':
    logging.basicConfig(level=logging.DEBUG)
    foo()

产量

DEBUG:__main__:.... [Hi Mom]
DEBUG:__main__:........ [Now we're cookin]

关于python - 按缩进或前缀长度显示日志上下文级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5498907/

相关文章:

python - 使用 Python 日志记录格式的制表

ios - NSNumberformatter 在尝试格式化匈牙利货币时显示 "HUF"而不是 "ft"

html - 在 CSS/HTML 中格式化考试

python 全屏无控制台/边框

python - `@` 在 Python 中是什么意思?

python - 如何使用 awk 或 grep 在日志文件中捕获整个 Python 回溯?

jsf - 了解 JSF 流程

database - 格式化数据,插入数据库之前还是之后?

python - 如何在抓取时加速请求模块?

python - 如何找到第一层的后代?