Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过主管和docker从django输出彩色原木_Django_Logging_Colors_Docker Compose - Fatal编程技术网

通过主管和docker从django输出彩色原木

通过主管和docker从django输出彩色原木,django,logging,colors,docker-compose,Django,Logging,Colors,Docker Compose,我的目标是在docker compose logs中获得MyDjangowebservice的彩色日志 我使用docker compose来管理基于Django框架的web服务列表 每个容器运行一个my_init bash脚本,该脚本依次运行一个runit(在我的例子中这是历史性的)脚本,该脚本运行一个supervisordprocess: Django服务器在WSGI中与Gunicorn接口,并通过Nginx提供服务 supervisord配置文件如下所示: [supervisord] ht

我的目标是在docker compose logs中获得MyDjangowebservice的彩色日志

  • 我使用docker compose来管理基于Django框架的web服务列表

  • 每个容器运行一个my_init bash脚本,该脚本依次运行一个runit(在我的例子中这是历史性的)脚本,该脚本运行一个supervisordprocess:

  • Django服务器在WSGI中与Gunicorn接口,并通过Nginx提供服务

  • supervisord配置文件如下所示:

    [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
    
  • 因为docker只能记录一个进程,所以我的容器的所有进程的日志都被转发到/dev/stdout/dev/stderr

  • 我使用颜色格式化程序为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 runserver日志是彩色的
    • ./manage.py runserver
    • 但是,从外部看,docker compose日志没有着色
  • 我试图在我的服务中添加tty:true,如前所述,但它似乎不再起作用

    tty: true
    有什么想法吗?

    这里是一个使用Gunicorn的Django应用程序的最简单的工作示例。诀窍是确保Gunicorn记录器配置为使用使用彩色格式化程序的处理程序

    设置.py 终端输出

    奖金 根据我的经验,检查日志配置的最佳方法是使用

    只需在应用程序上下文中执行它(例如在Django shell中)

    它应该打印出一个现有伐木工人的良好表现

    我更进一步,将其添加到我的
    url.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
    
    
    级别信息
    格式化程序
    |
    o
    |级别信息
    |滤器
    |处理者
    |水平误差
    |滤器
    |   |
    
    |还实现了那个家伙的要求在Django日志设置中有什么?你到底想给什么上色?我假设那些来自Gunicorn的人,在本例中,您是否更改了Gunicorn记录器的日志记录配置?请查看下面我的答案,以获得一个有效的示例。
    import logging_tree
    logging_tree.printout()
    
    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