跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 求教 Django(DRF)日志最佳实践
未分類
12 1 月 2021

求教 Django(DRF)日志最佳实践

求教 Django(DRF)日志最佳实践

資深大佬 : PowerRocker 2

求教各位,DRF 、gunicorn 、supervisor 部署的后端,有没有关于日志的最佳实践 为了能实现日志按天分隔,因为有多线程,默认人 log handler 会有问题,遂重写了个 handler 同时 gunicorn 本身的日志貌似也有点问题

求教各位有没有什么开源项目可以考下,我看了很多项目,对日志这一块都没有什么比较好的处理,很多项目甚至都没有记录日志

大佬有話說 (23)

  • 資深大佬 : leeguo

    我也想知道, 我想写个日志中间件的, 但是感觉自己写的不会太好…

  • 資深大佬 : tinypig

    django log 到一个文件里,然后用系统的 logrotate 来按天分割

  • 資深大佬 : TimePPT

    loguru

  • 資深大佬 : zzzmj

    logging.handlers.TimedRotatingFileHandler

  • 主 資深大佬 : PowerRocker

    @TimePPT 感谢

  • 主 資深大佬 : PowerRocker

    @zzzmj gunicorn 启动多个 worker 会有 bug

  • 資深大佬 : zzzmj

    @PowerRocker 打扰了,没认真看描述

  • 資深大佬 : lolizeppelin

    openstack/oslo.log 你值得拥有

  • 資深大佬 : lolizeppelin

    @tinypig

    代码里没写接信号重新打开 fd 尽量不要直接用 logrotate 分割
    人家 nginx 是收了信号的

  • 資深大佬 : tmackan

    @PowerRocker
    1.py 自带的 log 不是多线程安全的,所以需要用一个文件锁来控制并发丢日志问题
    2.log 库切割不是定时任务,而是每次 log 的时候判断下是否达到了切割时机
    3.log 整体压缩的 shell 脚本需要与 log 切割的时间点错开,这里涉及到一个文件描述符的占用问题,建议压缩时间延后

    一点经验

  • 資深大佬 : tmackan

    https://github.com/tmacjx/flask-quickstart/blob/master/common/log.py

    这里的 MultiProcessTimedRotatingFileHandler 可以参考下,只能按天切割
    没支持按大小切割,当日志量比较大的话,grep 很慢,这是个坑。。。

  • 主 資深大佬 : PowerRocker

    @tmackan 谢谢大佬,看了下你的项目,和你使用的方法一样,不知大佬有没有一些 Django 相关的开源项目对日志这一块处理的比较好的

  • 資深大佬 : aladdindingding

    自己写一个 logserver 然后日志统一用 server 来打 这个应该写成一个公共组件了 多进程也没问题

  • 資深大佬 : lolizeppelin

    linux 下可以用 pyinotify 监控 IN_MOVED_FROM 和 IN_DELETE

    监控到事件以后重新打开文件

    这样可以用 logrotate 灵活配置

    可以参考 oslo_log.watchers.FastWatchedFileHandler

  • 資深大佬 : encro

    supervisor 将日志重定向?

    https://channels.readthedocs.io/en/stable/deploying.html

    [fcgi-program:asgi]
    # TCP socket used by Nginx backend upstream
    socket=tcp://localhost:8000

    # Directory where your site’s project files are located
    directory=/my/app/path

    # Each process needs to have a separate socket file, so we use process_num
    # Make sure to update “mysite.asgi” to match your project name
    command=daphne -u /run/daphne/daphne%(process_num)d.sock –fd 0 –access-log – –proxy-headers mysite.asgi:application

    # Number of processes to startup, roughly the number of CPUs you have
    numprocs=4

    # Give each process a unique name so they can be told apart
    process_name=asgi%(process_num)d

    # Automatically start and recover processes
    autostart=true
    autorestart=true

    # Choose where you want your log to go
    stdout_logfile=/your/log/asgi.log
    redirect_stderr=true

  • 資深大佬 : encro

    熟悉 django 的话那么就选 sentry?

  • 資深大佬 : zachlhb

    settings 里配置 log 就可以按天啊

  • 資深大佬 : 614457662

    logrotate,按天或者按文件大小分隔,记得 logrotate 在配置时加上 usr1 信号发给 gunicorn,让 gunicorn 重载日志就可以了。完美解决多 worker 日志压缩错误的问题。

  • 資深大佬 : johnsona

    题主说法不准确,python 自带的 logging 是线程安全的,多线程环境下按时间和大小滚动没问题,但是多进程不安全,而 gunicorn 是多进程,方案的话。有说让操作系统切割,有说开启 socket server 但是存在网络问题会不会丢日志,sentry 是记录错误日志的,或者 elk 一把梭,还有就是有一个 multiprocesing log 库,用的文件锁还是什么不清楚,还有 logru 这个库,还有人重写 handler 什么的,各有各的写法,换 go 吧,伤心了

  • 主 資深大佬 : PowerRocker

    @aladdindingding
    @lolizeppelin
    @encro
    @zachlhb
    @614457662
    @johnsona
    感谢各位大佬,目前也是重写了 handler,整体问题不大,就是一直想知道有没有什么最佳实践,想找些开源项目多学习学习

  • 資深大佬 : tmackan

    @johnsona 说的有道理,的确是进程不安全,log 这块有使用 threadlock,所以是多线程安全

  • 資深大佬 : johnsona

    @PowerRocker 我也想,linux 自带的 logrotate 不知道怎么解决 gunicorn 的日志问题,openstck 的 oslo 我也是看这个帖子才知道,说不定可以

  • 資深大佬 : todd7zhang

    1. python 代码里面只用 logging.StreamHandler(),
    2. supervisor 启动 django,同时配置 stdout_logfile=/log/log.log redirect_stderr=true,
    3. logrotate 按天分割 /log/log.log 文件

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具