提取日志记录语句前后的源代码行

2024-06-17 12:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用astor和python AST提取日志语句前后的源代码行,这要感谢我前面的StackOverflow问题的答案:

import ast
import astor
import json
class LogPrinter(astor.TreeWalk):
    def pre_Call(self):
        if (isinstance(self.cur_node.func, ast.Attribute) and
            isinstance(self.cur_node.func.value, ast.Name) and
            (self.cur_node.func.value.id.lower() == "logging" or self.cur_node.func.value.id.lower() == "log" or self.cur_node.func.value.id.lower() == "logger")
           ):
            print(astor.to_source(self.cur_node))
       
    def post_Call(self):
        if (isinstance(self.cur_node.func, ast.Attribute)):
            print(astor.to_source(self.cur_node))

我可以从上述代码中获取日志语句,但无法获取完整的前面和下面的语句:

例如:

def db_contecton(string url):
    if URL:
        #multiline logger
        logger.debug(
        "connecting to 
        URL : " +url)
        #multiline source code
        db = db
        .conn.
        init()
        db.connect(url)
        #multiline logger
        logger.
        info("connection 
        to DB 
        successful")

我试图获得的输出是: (一)

if url:
logger.debug("connecting to URL : " +url)
db = db.conn.init()

及 (二)

db = db.conn.init()
db.connect(url)
logger.info("connection to DB successful")

注:多行记录器和源代码转换为单行

在这一点上,我可以提取记录器并获得以下没有完整源代码的语句: 我当前的输出是

#the statement above logger is missing
logger.debug("connecting to URL : " +url) 
db.conn.init() #the db variable is missing should be db = db.conn.init()

以上只是python源代码的示例片段,逻辑上可能不正确


Tags: toselfnodeurldbif源代码init
1条回答
网友
1楼 · 发布于 2024-06-17 12:25:59

我不确定我是否理解了您的问题:您是否希望将python文件解析为文本,并提取上面的1行和下面的1行,只要它有一些与日志相关的代码

您可以将文件读取为文本,将其分成几行,与所需的单词匹配(例如:logger,logging,log),保留这些行的索引,然后对其执行任何操作:

log_words = 'logger logging log'.split()

python_files = ['file1.py', 'file2.py']

keep = dict()

for f in python_files:
    keep[f] = []
    with open(f, 'r') as f:
        lines = f.readlines()
            for i in range(len(lines)):
                for w in log_words:
                    if w in lines[i]:
                      keep[f].append(i - 1) # previous line
                      keep[f].append(i)     # actual line
                      keep[f].append(i + 1) # next line

它检查每一行中每个给定文件的每个所需单词。 但这不是表演性的。 但我相信它解决了你的问题

相关问题 更多 >