请问一下各位,在 web 框架里面 logging 是怎么写的呢

2017-06-10 22:44:18 +08:00
 chenqh
比如
有一个接口,我会记录用户的请求数据 dataA,比如 querystring 再加其他一些数据,
但是我又不想把 dataA 直接用 print
输出到 sys.stdout 里面去,因为这样 dataA 并不好找,所以我就用了 FileRotateHandler,并设置文件最大为 50M,
然而这样会产生一个问题就是,当我用 supervisor 启动多个 web 进程的时候,我发现有许多日志文件大为在 5M 
的时候就被切割出来了。如果要解决这种问题是不是只有使用队列这一种方式呢

1987 次点击
所在节点    Python
6 条回复
0asis
2017-06-10 22:53:44 +08:00
一般框架都会自带 log 模块吧
chenqh
2017-06-10 23:12:58 +08:00
@0asis log 模块无法处理由于多个 supervisor 进程 导致的多进程问题吧,除非让 supervisor 来处理
Fishdrowned
2017-06-10 23:17:22 +08:00
不懂 python。你可以 log 到 rsyslog,然后用 logrotate 分割 log 文件
SErHo
2017-06-10 23:19:23 +08:00
我一般采用下面两种方法:

1. 日志直接输出到 stdout,如直接 print 或者 logging.StreamHandler,然后配置 supervisor 的 stdout_logfile 来将标准输出记录到文件

2. FileRotateHandler 不是进程安全的,多个进程使用会在切文件的时候产生竞争,造成文件切的大小不准确,可以实现一个多进程安全的 RotatingFileHandler

https://gist.github.com/SerhoLiu/a3d7be43df882af80ef98bc375fc6046.js
chenqh
2017-06-10 23:25:45 +08:00
@SErHo 就是不能输出到 stdout 里面呀,因为这个日志要单独保存。。方便日后查看
Ge4Los
2017-06-10 23:43:06 +08:00
FileRotateHandler 不是进程安全的。
用 WatchedFileHandler 来写日志,多个进程可以写同一个日志文件。
有切日志的需求,用 logrotate 来切。

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

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

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

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

© 2021 V2EX