首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过supervisor和docker-compose从django输出彩色日志

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

Stack Overflow用户
提问于 2016-11-25 19:11:38
回答 1查看 2.9K关注 0票数 12

我的目标是着色我的日志Djangowebservice indocker-编写日志..。

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

每个容器,运行一个我的_初始化bash脚本,该脚本依次运行runit

(在我的例子中这是有历史意义的)脚本,它运行一个主管命令进程:

我的_init---runsvdir-+-runsv---run---supervisord-+-gunicorn---gunicorn ||-nginx-8*nginx||-python-9*python|-python-python (Django)-runsv Django服务器在WSGI中使用Gunicorn,并通过

Nginxsupervisord conf如下所示:

主管命令http_port=/var/tmp/supervisor.sock;(默认运行UNIX域套接字服务器) stdout_日志文件=/dev/ stdout stdout_日志文件_

maxbytes=0标准错误_logfile=/dev/stderr stderr_日志文件_

maxbytes=0 节目:gunicorn_核心_服务#environment=myapp

_VENV=/opt/myapp/venv/environment=PYTHONPATH=/opt/myapp/myappServer/myappServer命令= /opt/myapp/venv/bin/gunicorn -b 0.0.0.0:8000 --超时90 --访问日志文件/开发/标准输出--错误-日志文件/开发/标准错误目录=/opt/myapp/myapp服务器用户=根autostart=true autorestart=true重定向_stderr=true标准输出_

日志文件=/dev/ stdout stdout_日志文件_maxbytes=0标准错误

_logfile=/dev/stderr stderr_日志文件_maxbytes=0节目:django-celery命令=/opt/myapp/venv/bin/python./manage.py celery --app=myappServer.celeryapp:app worker -B --loglevel=INFO directory=/opt/myapp/myappServer numprocs=1 stdout

_日志文件=/dev/ stdout stdout_日志文件_maxbytes=0标准错误

_logfile=/dev/stderr stderr_日志文件_maxbytes=0重定向

_stderr=true autostart=true autorestart=true startsecs=10

节目:nginx command=nginx用户“守护进程关闭;”# -g =根autostart=true autorestart=true重定向_stderr=true标准输出

_日志文件=/dev/ stdout stdout_日志文件_maxbytes=0标准错误

_logfile=/dev/stderr stderr_日志文件_maxbytes=0由于docker只能记录一次进程,所以我的容器的所有进程的日志都会转发到/dev/stdout

和/dev/stderr我使用颜色日志作为颜色格式化程序对Django日志进行着色:

‘'formatters':{ 'color':{ '()':'colorlog.ColoredFormatter','format':'%(log_颜色)s%(级别名称)-8s%(消息)s‘,’日志_颜色‘:{’调试‘:’粗体_黑色‘,’信息‘:’白色‘,’警告‘:’黄色‘,’错误‘:’红色‘,’严重‘:’粗体_红色‘,},} },

代码语言:javascript
运行
复制
- When I run the service from inside the container ./manage.py runserver

原木是彩色的。

-但是,从外部来看,docker-compose日志不会着色。

我试着添加

代码语言:javascript
运行
复制
tty: true

在我的服务中这里,但它似乎不再起作用了。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-14 00:53:53

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

settings.py

代码语言:javascript
运行
复制
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']
        }
    }
}

终端输出

奖金

(根据我的经验)检查日志配置的最好方法是使用日志记录_树..。

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

代码语言:javascript
运行
复制
import logging_tree
logging_tree.printout()

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

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

代码语言:javascript
运行
复制
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])

它应该返回类似于以下内容的内容

代码语言:javascript
运行
复制
<--""
   Level INFO
   Handler Stream <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'>
     Level INFO
     Formatter 
   |
   o<--"django"
   |   Level INFO
   |   Handler Stream <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'>
   |     Level INFO
   |     Filter 
   |   Handler 
   |     Level ERROR
   |     Filter 
   |   |
   |   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='' mode='w' encoding='UTF-8'>
   |   |     Level INFO
   |   |     Formatter 
   |   |
   |   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='' mode='w' encoding='UTF-8'>
       |     Level INFO
       |     Formatter 
       |
       o   "gunicorn.error"
       |   Level INFO
       |   Propagate OFF
       |   Handler Stream <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'>
       |     Level INFO
       |     Formatter 
       |
       o<--"gunicorn.http"
          Level NOTSET so inherits level INFO
           |
           o<--"gunicorn.http.wsgi"
               Level NOTSET so inherits level INFO
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40803674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档