分享:如何取出变量的变量名,自动赋值到结构化日志中

2021-04-27 15:28:09 +08:00
 CzaOrz

之前因为比较喜欢 golang 的结构化日志模块 logrus,所以模仿写了个 loggus
最近项目原因,写了一段时间的 golang,又回到 python 中...

于是又接触到了自己写的 loggus,然后写了很多类似这样的代码

import loggus

def userInfo(name, age, phone):
    loggus.withFields({
        "name": name,
        "age": age,
        "phone": phone,
    }).info("0.0")

userInfo("小明", 18, 10086)
# 输出
# time="2021-04-27 15:02:17.671655" level=info msg="0.0" name="小明" age=18 phone=10086

我自己写着写着发现,为结构化日志赋值时,很多 key 值,和变量的变量名是相同的,但我不得不重新写一遍。
就像上面的那个字典:

{
    "name": name,
    "age": age,
    "phone": phone,
}

于是近期就在思考:是否可以自动取出该变量的变量名,自行完成赋值操作?

参考了较多的文章和 logging 源码之后,发现有一条思路是值得借鉴的:通过回溯调用栈,找到调用函数的源码,通过正则取出所需变量名,然后进行赋值。

最后实现了一个神奇的方法 loggus.withVariables,类似这样:

import loggus

def userInfo(name, age, phone):
    loggus.withVariables(name, age, phone).info("0.0")
    # 输出
    # time="2021-04-27 14:38:05.400769" level=info msg="0.0" name="小明" age=18 phone=10086

    loggus.withVariables(
        name,
        age,
        phone,
    ).info("0.0")
    # 输出
    # time="2021-04-27 14:38:05.400769" level=info msg="0.0" name="小明" age=18 phone=10086

if __name__ == '__main__':
    userInfo("小明", 18, 10086)

最后总结:花里胡哨没啥用,哈哈哈
有兴趣的可以看下实现: https://github.com/CzaOrz/loggus

1597 次点击
所在节点    Python
7 条回复
TimePPT
2021-04-27 15:54:16 +08:00
xingheng
2021-04-27 16:28:19 +08:00
不需要 inspect,直接调用内置的 locals() 就行了
est
2021-04-27 16:30:53 +08:00
f"{name=}, {age=}"
CzaOrz
2021-04-27 17:05:02 +08:00
@xingheng 在这个场景下 locals() 确实最佳,但是只涉及其中部分变量时,就还需要操作下了。
CzaOrz
2021-04-27 17:10:31 +08:00
@TimePPT loguru 当时用过,因为要输出 json,所以直接自己写了个
CzaOrz
2021-04-27 17:11:58 +08:00
@est f 赋值内部实现挺有意思的
no1xsyzy
2021-04-28 10:33:28 +08:00
写成装饰器(

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773618

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX