celery的log如何传递给django,由django管理

celery自己管理log目录

celery worker --autoscale=4,1 --app=erebus.celeryapp:app -l info -f /home/admin/output/erebus/logs/worker.log -Q erebus,celery

celery beat --loglevel info --app erebus.celeryapp:app --logfile /home/admin/output/erebus/logs/beat.log

celery flower -A erebus.celeryapp:app --broker=sentinel://:[email protected]:26379/6 --basic_auth=flower:flower,user:password

日志给django管理

配置EREBUS_WORKER_HIJACK_ROOT_LOGGER=False 参考配置的日志选项:http://docs.celeryproject.org/en/latest/userguide/configuration.html

django的日志配置:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'verbose': {
        # 后缀d表示数据格式是整数,s表示数据格式是字符串
        'format': '[%(levelname)s] [%(asctime)s] [%(module)s] %(filename)s:%(lineno)d %(funcName)s '
                  '%(processName)s:[%(process)d] %(threadName)s:[%(thread)d] %(message)s'
        # 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
        # 'style': '{',
    },
    'simple': {
        'format': '[%(levelname)s] [%(asctime)s] %(message)s',
        # 'format': '[%(asctime)s] %(message)s',
        # 后缀d表示数据格式是整数,s表示数据格式是字符串
        # 'format': '[%(levelname)s] [%(asctime)s] [%(module)s] %(filename)s:%(lineno)d %(funcName)s '
        #           '%(processName)s:[%(process)d] %(threadName)s:[%(thread)d] %(message)s',
        # 'style': '{',
    },
    'standard': {
        # 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
        'format': '{asctime} [{levelname:7}] {name:30}: {message}',
        # 设置上面格式样式;{levelname:3}是告警级别,至少显示7个字符,少则补空格;多则正常显示
        # 这里style选择{,是指{asctime}这种形式。
        # 如果选择%,则是%(asctime)s这种形式。
        # 还有一种选择,是$,是$asctime或${asctime}这种形式。
        'style': '{',
        # 设置时间格式
        'datefmt': '%Y-%m-%d %H:%M:%S',
    },
    'operation': {
        'format': '%(message)s'
    }
},
# 'filters': {
#     # 'special': {
#     #     '()': 'erebus.logging.SpecialFilter',
#     #     'foo': 'bar',
#     # },
#     'require_debug_true': {
#         '()': 'django.utils.log.RequireDebugTrue',
#     },
# },

# Handler是决定如何处理logger中每一条消息的引擎。它描述特定的日志行为,比如把消息输出到屏幕、文件或网络socket。
# 和 logger 一样,handler 也有日志级别的概念。如果一条日志记录的级别不匹配或者低于 handler 的日志级别,
# 对应的消息会被 handler 忽略。
'handlers': {
    'default': {
        # 'level': 'WARNING',
        # 'class': 'logging.handlers.RotatingFileHandler',
        # 'filename': '{}/default.log'.format(BASE_LOG_DIR),
        # 'maxBytes': 1024*1024*5*20,  # 5*20 MB
        # 'maxBytes': 1024*5,  # 5 KB
        # 保留7天的日志,没份5M,5份大概是一个小时的日志内容,主要是kafka日志
        # 'backupCount': int(5*1*24*7/20),
        # 'formatter': 'standard',

        'level': 'WARNING',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'app.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,

    },
    'pipeline': {
        # 'level': 'DEBUG',
        # 'class': 'logging.handlers.RotatingFileHandler',
        # 'filename': '{}/pipeline.log'.format(BASE_LOG_DIR),
        # 'maxBytes': 1024*1024*5*20,  # 5*20 MB
        # 'maxBytes': 1024*5,  # 5 KB
        # 保留7天的日志,没份5M,5份大概是一个小时的日志内容,主要是kafka日志
        # 'backupCount': int(5*1*24*7/20),
        # 'formatter': 'standard',

        'level': 'DEBUG',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'pipeline.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'kafka': {
        # 'level': 'DEBUG',
        # 'class': 'logging.handlers.RotatingFileHandler',
        # 'filename': '{}/kafka.log'.format(BASE_LOG_DIR),
        # 'maxBytes': 1024*1024*5*20,  # 5*20 MB
        # 'maxBytes': 1024*5,  # 5 KB
        # 保留7天的日志,没份5M,5份大概是一个小时的日志内容,主要是kafka日志
        # 'backupCount': int(5*1*24*7/20),
        # 'formatter': 'standard',

        'level': 'INFO',
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'kafka.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'output_to_server': {
        'level': 'WARNING',  # 忽略debug/info信息
        'class': 'logging.handlers.HTTPHandler',
        'host': '127.0.0.1:8088',
        'url': '/api/v1/log',
        # 使用GET方法遇到url最大长度限制
        'method': 'POST',
        'formatter': 'verbose',
    },
    'jenkins': {
        'level': 'DEBUG',  # 忽略debug信息
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': '{}/{}.log'.format(BASE_LOG_DIR, 'jenkins'),
        'formatter': 'simple' if DEBUG else 'verbose',
        'encoding': 'utf8',
        'maxBytes': 1024*1024*5*20,  # 5*20 MB
        'backupCount': int(5*1*24*7/20),
    },
    'django': {
        # 'level': 'INFO',  # 忽略debug信息
        # 'class': 'logging.handlers.RotatingFileHandler',
        # 'filename': '{}/{}.log'.format(BASE_LOG_DIR, conf.get('log', 'name')),
        # 'formatter': 'simple' if DEBUG else 'verbose',
        # 'encoding': 'utf8',
        # 'maxBytes': 1024*1024*5*20,  # 5*20 MB
        # 'backupCount': int(5*1*24*7/20),

        'level': 'INFO',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': '{}.log'.format(conf.get('log', 'name')),
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'gunicorn_error': {
        'level': 'INFO',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'gunicorn_error.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'gunicorn_access': {
        'level': 'INFO',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'gunicorn_error.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'celery': {
        'level': 'INFO',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'celery.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'flower': {
        'level': 'INFO',  # 忽略debug信息
        'class': 'utils.graylog.graylog_django.GraylogHandler',
        'app': 'erebus',
        'file': 'flower.log',
        'host': GRAYLOG_HOST,
        'port': GRAYLOG_PORT,
        'localname': GRAYLOG_SOURCE,
    },
    'console': {
        'level': 'DEBUG' if DEBUG else 'WARNING',  # 所有的日志都会被输出到console
        # 'filters': ['require_debug_true'],
        'class': 'logging.StreamHandler',
        'formatter': 'simple'
    },
    'operation': {
        'level': 'INFO',
        'class': 'logging.FileHandler',
        'filename': '{}/{}.log'.format(BASE_LOG_DIR, 'operation'),
        'formatter': 'operation',
        'encoding': 'utf8'
    },
    'test': {
        'level': 'INFO',
        'class': 'logging.FileHandler',
        'filename': '{}/{}.log'.format(BASE_LOG_DIR, 'test'),
        'formatter': 'standard',
        'encoding': 'utf8'
    }
    # 'mail_admins': {
    #     'level': 'ERROR',
    #     'class': 'django.utils.log.AdminEmailHandler',
    #     # 'filters': ['special']
    # }
},
'loggers': {

    # 可以通过使用空字符串:''来设置'catch all' logger
    # 在以下设置中,将所有日志事件级别为WARNING及以上的日志发送给日志服务器,但配置为'propagate': False日志事件除外,
    '': {
        'handlers': ['default', 'output_to_server'],
        # 'handlers': ['default'],
        # 这样情况下的level设置是无效的,所有级别的信息都会传给handlers处理,由handlers的level界别决定
        # 'level': 'ERROR',
        'propagate': False
    },
    # 记录所有jenkins的requests相关的日志;jenkins->requests->urllib3
    'urllib3': {
        'handlers': ['jenkins'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': True
    },
    # 记录所有kakfa相关的日志kafka.conn/kafka.client/kafka.coordinator.consumer
    'kafka': {
        'handlers': ['kafka'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': True
    },
    # 这里必须使用名字django和django.request,目的是为了捕获django框架的日志内容
    'django': {
        'handlers': ['django', 'console'],
        # 当 logger 处理一条消息时,会将自己的日志级别和这条消息的日志级别做对比。
        # 如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。
        # 否则这条消息就会被忽略掉。当 logger 确定了一条消息需要处理之后,会把它传给 Handler。
        # 把INFO及以上级别的日志传给handlers,然后由handlers根据handlers的level进一步处理日志输出
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': True,  # 若值为False,表示日志不会传到上个层级,自然也不会传到default.log里
    },
    # 使用logger = logging.getLogger('django.request'), logger.info('info'),
    # 可以把日志输出到'handlers': ['django', 'console'],
    'django.request': {
        # 即使和django的handlers一样,level也一样,也并不会产生2次相同的日志内容,应该是个并集。
        'handlers': ['django', 'console'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        # 会把日志向django.request的上层django传播
        'propagate': True,
    },
    # sql语句
    'django.db.backends': {
        # 即使和django的handlers一样,level也一样,也并不会产生2次相同的日志内容,应该是个并集。
        'handlers': ['django', 'console'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        # 会把日志向django.request的上层django传播
        'propagate': True,
    },
    # 'erebus.custom': {
    #     'handlers': ['console', 'mail_admins'],
    #     'level': 'INFO',
    #     # 'filters': ['special']
    # },
    # 名字随意起,用时,使用logger = logging.getLogger(conf.get('log', 'name'))获取,传到相应的loggers里就可以
    'operation': {
        'handlers': ['operation'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': True,
    },
    'test': {
        'handlers': ['console', 'test'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    },
    'pipeline': {
        'handlers': ['pipeline'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    },
    'gunicorn.error': {
        'handlers': ['gunicorn_error'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    },
    'gunicorn.access': {
        'handlers': ['gunicorn_access'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    },
    'celery': {
        'handlers': ['celery'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    },
    'flower': {
        'handlers': ['flower'],
        'level': 'DEBUG' if DEBUG else 'INFO',
        'propagate': False,  # 不要传给上一层级
    }
}
}

原文地址:https://www.cnblogs.com/shengulong/p/11167412.html

时间: 2024-10-22 12:49:42

celery的log如何传递给django,由django管理的相关文章

django中将views.py中的python方法传递给html模板文件

常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): caption = models.CharField(max_length=16) class Category(models.Model): caption = models.CharField(max_length=16) class Artical(models.Model): title = mo

如何获取url中的参数并传递给iframe中的报表

在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数呢?以下用报表软件FineReport简单介绍一些. 具体实现过程 将报表生成页面时,给网页添加onload事件,首先获取url中的参数,然后嫁接到iframe的src上,或者通过获得的参数拼接处完整的报表url赋给iframe的src. <html> <head> <title

详解~实现Runnable方法创建线程之为什么要将Runnable接口的子类对象传递给Thread的构造函数

/** * @author zhao * @TIME 0419 22:56  End *定义线程的第二种方法:实现Runnable接口 *步骤:1,定义一个子类实现Runnable接口 *    2,在子类中覆盖run()方法,并且将多线程锁执行的代码写入run方法中 *    3,通过Thread类建立线程对象: *    4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数.  为什么要将Runnable接口的子类对象传递给Thread的构造函数.  因为,自定义的

PHP中的多行字符串传递给JavaScript方法两则

PHP和JavaScript都是初学.近期有这么个需求: 例如说有一个PHP的多行字符串: $a = <<<EOF thy38 csdn blog EOF; 传递给JavaScript后要等价于: var c='thy38\ncsdn\nblog'; 由于对这两门语言的理解低到不知怎样Google.仅仅好自己摸索出方法两则: 1.  将PHP先转义.然后切割.然后转JSON,然后JavaScript parse,最后用\n拼接. var b=JSON.parse(<? php ec

将数组名作为变元传递给“被调用函数“

#include <stdio.h> void change_array(char*, int); int main(void) { char a[10] = "abcdefg"; printf("The address of origin a = %p\n",a); change_array(a, 10); printf("The address of later a = %p\n",a); printf("%s\n&qu

vertex source顶点源直接传递给scanline rasterizer效果

AGG内置了大量的顶点源,我们可以直接调用,他们包括: agg::path_storage agg::arc agg::rounded_rect agg::ellipse agg::curve3 agg::curve4 ...... 1)针对agg::path_storage 现在尝试查看agg::path_storage直接传递给scanline rasterizer之后的效果: //现在我们尝试描绘一条线段,这里有一个问题不通过agg::conv_stroke,怎么 //设置线段的宽度,默认

【Django】django 处理request流程细节(转)

首先发生的是一些和 Django 有关(前期准备)的其他事情,分别是: 如果是 Apache/mod_python 提供服务,request 由 mod_python 创建的 django.core.handlers.modpython.ModPythonHandler 实例传递给 Django. 如果是其他服务器,则必须兼容 WSGI,这样,服务器将创建一个 django.core.handlers.wsgi.WsgiHandler 实例. 这两个类都继承自 django.core.handl

Django + Ansible 主机管理

本文分享内容如下: 内容目录 Django 基础 MVC ORM COMMAND AuthenticationAnsible 基础 配置 ad-hoc 命令集 python api代码解读 演示 创建虚拟化环境并进入python3/python -m venv venv(linux)source venv\bin\active(win) venv\Scripts\active 安装第三方库pip install -r requirements.txt 初始化python manage.py ma

[django] Deploy Django Applications Using uWSGI and Nginx on Ubuntu 14.04

关键点1:chmod-socket=666 (mysite_uwsgi.ini) 关键点2 : 工程目录和虚拟环境目录搞清楚 几个参考: http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-