繁体   English   中英

通过 supervisor 和 docker-compose 从 django 输出彩色日志

[英]Output colored logs from django through supervisor and docker-compose

我的目标是在docker-compose logs 中获取我的Django webservice 的彩色日志

  1. 我使用 docker-compose 来管理基于 Django 框架的 Web 服务列表。

  2. 每个容器运行一个my_init bash 脚本,该脚本又运行一个runit (在我的案例中这是历史性的)脚本,该脚本运行一个supervisord进程:

     my_init---runsvdir-+-runsv---run---supervisord-+-gunicorn---gunicorn | |-nginx---8*[nginx] | |-python---9*[python] | |-python---python (Django) | `-redis-server---2*[{redis-server}] `-runsv
  3. Django 服务器在 WSGI 中与Gunicorn接口,并通过Nginx 提供服务

  4. supervisord conf 如下:

     [supervisord] http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server) stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:gunicorn_core_service] #environment=myapp_VENV=/opt/myapp/venv/ environment=PYTHONPATH=/opt/myapp/myappServer/myappServer command = /opt/myapp/venv/bin/gunicorn wsgi -b 0.0.0.0:8000 --timeout 90 --access-logfile /dev/stdout --error-logfile /dev/stderr directory = /opt/myapp/myappServer user = root autostart=true autorestart=true redirect_stderr=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:django-celery] command=/opt/myapp/venv/bin/python ./manage.py celery --app=myappServer.celeryapp:app worker -B --loglevel=INFO directory=/opt/myapp/myappServer numprocs=1 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 redirect_stderr=true autostart=true autorestart=true startsecs=10 [program:nginx] command=nginx -g "daemon off;" #user = root autostart=true autorestart=true redirect_stderr=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
  5. 由于docker只能记录一次进程,所以我容器的所有进程的日志都转发到/dev/stdout/dev/stderr

  6. 我使用colorlog作为颜色格式化程序来为 Django 日志着色:

     'formatters': { 'color': { '()': 'colorlog.ColoredFormatter', 'format': '%(log_color)s%(levelname)-8s %(message)s', 'log_colors': { 'DEBUG': 'bold_black', 'INFO': 'white', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'bold_red', }, } },
    • 当我从容器内部运行服务时
       ./manage.py 运行服务器
      日志是彩色的。
    • 然而,从外面看,docker-compose 日志没有着色。

我试着添加

tty: true
在我这里描述的服务中,但它似乎不再起作用。

有什么想法吗?

这是与 Gunicorn 一起提供的 Django 应用程序的最小工作示例。 诀窍是确保 Gunicorn 记录器配置为使用使用彩色格式化程序的处理程序。

设置.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'colored_verbose': {
            '()': 'colorlog.ColoredFormatter',
            'format': "%(log_color)s%(levelname)-8s%(red)s%(module)-30s%(reset)s %(blue)s%(message)s"
        },
    },
    'handlers': {
        'colored_console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'colored_verbose'
        }
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'handlers': ['colored_console'],
        },
        'gunicorn.access': {
            'handlers': ['colored_console']
        },
        'gunicorn.error': {
            'handlers': ['colored_console']
        }
    }
}

终端输出

彩色原木

奖金

检查日志记录配置的最佳方法(根据我的经验)是使用logging_tree

只需在您的应用程序上下文中执行此操作(例如在 Django shell 中)

import logging_tree
logging_tree.printout()

它应该打印出现有记录器的一个很好的表示。

我更进一步,将它添加到我的urls.py这样我就可以在安装所有记录器后看到日志配置。

from django.conf.urls import url
from django.http import HttpResponse
import logging_tree

urlpatterns = [
    url(r'^loggers', loggers),
]

def loggers(request):
    """
    Returns a representation of the existing loggers
    """
    return HttpResponse(logging_tree.format.build_description()[:-1])

它应该返回与此类似的内容

<--""
   Level INFO
   Handler Stream <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
     Level INFO
     Formatter <colorlog.colorlog.ColoredFormatter object at 0x1103a1668>
   |
   o<--"django"
   |   Level INFO
   |   Handler Stream <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
   |     Level INFO
   |     Filter <django.utils.log.RequireDebugTrue object at 0x11047d518>
   |   Handler <AdminEmailHandler (ERROR)>
   |     Level ERROR
   |     Filter <django.utils.log.RequireDebugFalse object at 0x11053a7f0>
   |   |
   |   o<--"django.db"
   |   |   Level NOTSET so inherits level INFO
   |   |   |
   |   |   o<--"django.db.backends"
   |   |       Level NOTSET so inherits level INFO
   |   |       |
   |   |       o<--"django.db.backends.schema"
   |   |           Level NOTSET so inherits level INFO
   |   |
   |   o<--"django.request"
   |   |   Level NOTSET so inherits level INFO
   |   |
   |   o   "django.server"
   |   |   Level INFO
   |   |   Propagate OFF
   |   |   Handler Stream <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
   |   |     Level INFO
   |   |     Formatter <django.utils.log.ServerFormatter object at 0x11053a630>
   |   |
   |   o<--"django.template"
   |       Level NOTSET so inherits level INFO
   |
   o<--"gunicorn"
       Level NOTSET so inherits level INFO
       |
       o   "gunicorn.access"
       |   Level INFO
       |   Propagate OFF
       |   Handler Stream <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
       |     Level INFO
       |     Formatter <colorlog.colorlog.ColoredFormatter object at 0x1103a1668>
       |
       o   "gunicorn.error"
       |   Level INFO
       |   Propagate OFF
       |   Handler Stream <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
       |     Level INFO
       |     Formatter <colorlog.colorlog.ColoredFormatter object at 0x1103a1668>
       |
       o<--"gunicorn.http"
          Level NOTSET so inherits level INFO
           |
           o<--"gunicorn.http.wsgi"
               Level NOTSET so inherits level INFO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM