V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
superbai
V2EX  ›  Python

Python 如何进行全局的请求日志记录?

  •  
  •   superbai · 2019-06-06 13:36:26 +08:00 · 2475 次点击
    这是一个创建于 2027 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有多个接口,怎么能够给这些接口添加统一的请求日志记录功能,并且自动在有新增的接口时,也无感增加日志记录?

    在网上搜索到的方法都是写一个装饰器,然后在接口函数上使用这个装饰器。这种方法没有满足无感的需求,如果写代码的时候忘记加装饰器的话,就没有日志记录了

    第 1 条附言  ·  2019-06-06 14:47:49 +08:00
    补充下,基于框架或者继承的实现我都清楚,不过这两种方法都和特定的代码 /框架紧耦合在一起了,除了这些还有其它方法么?
    15 条回复    2019-06-09 22:26:04 +08:00
    so1n
        1
    so1n  
       2019-06-06 14:11:41 +08:00
    中间件
    ifoolish
        2
    ifoolish  
       2019-06-06 14:23:07 +08:00
    全部接口继承一个基类
    lauix
        3
    lauix  
       2019-06-06 14:26:23 +08:00
    什么框架,flask 可以设置生命周期。其他框架也有的,自己查查文档。也可以自己写个 装饰器。
    superbai
        4
    superbai  
    OP
       2019-06-06 14:45:07 +08:00
    @ifoolish 嗯嗯,除了这种方式,还有其它的方法么?
    @lauix 不用框架有什么方法么?
    @so1n 是指 django 的中间件么?不用框架有什么方法么?
    binux
        5
    binux  
       2019-06-06 14:46:59 +08:00
    不用框架就只能 monkey patch 了
    ipwx
        6
    ipwx  
       2019-06-06 14:47:43 +08:00
    @superbai 做一个 metaclass,然后你就可以自动给所有成员函数自动加装饰器了。
    polebug
        7
    polebug  
       2019-06-06 15:02:09 +08:00
    赞同楼上 写一个 metaclass 给所有成员函数加上这个装饰器
    不过我不觉得直接给接口函数加装饰器有什么问题
    lihongjie0209
        8
    lihongjie0209  
       2019-06-06 15:07:11 +08:00
    没有拦截器?
    flyingghost
        9
    flyingghost  
       2019-06-06 16:28:53 +08:00
    实在想无感,直接在 nginx 反代层做好了。
    思维不要限制在 flask 之内嘛。
    superbai
        10
    superbai  
    OP
       2019-06-06 18:21:14 +08:00
    @binux
    @ipwx
    @polebug
    感谢,我瞅瞅;接口加装饰器当然没问题,不过我觉得有点烦...

    @lihongjie0209 Java 的那个拦截器么?我也想问哈哈哈,看起来是没有的

    @flyingghost 感谢,虽然一般没有这么做的,但也是个思路~
    xchange
        11
    xchange  
       2019-06-06 18:56:32 +08:00
    所有 logger 都输出到 stderr,然后用 supervisor 把输出重定向到一个文件里
    troywinter
        12
    troywinter  
       2019-06-06 18:59:36 +08:00
    如果是接口的请求最好直接在网关层做,微服务里应该很好做,我不喜欢在服务自己的框架里做很多事情,keep it simple
    chengxiao
        13
    chengxiao  
       2019-06-06 19:11:21 +08:00 via iPhone
    uwsgi 的日志不是记录的都有么?直接日子分析下不就好了?
    sazima
        14
    sazima  
       2019-06-06 20:05:51 +08:00
    @app.before_request
    linvaux
        15
    linvaux  
       2019-06-09 22:26:04 +08:00
    emm.....我之前就是写了个装饰器,没想到什么好办法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:39 · PVG 14:39 · LAX 22:39 · JFK 01:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.