【问题标题】:Writing to same log file with Pyramid and rq使用 Pyramid 和 rq 写入相同的日志文件
【发布时间】:2014-12-23 12:59:31
【问题描述】:

我正在使用 Pyramid 和 rq,我想将 rq worker 作业记录在与我的 Pyramid 应用程序相同的文件中。

我的设置如下所示:

development.ini

# regular pyramid setup here...

[loggers]
keys = root, main

[handlers]
keys = console, debuglog

[formatters]
keys = generic

[logger_root]
level = DEBUG
handlers = console, debuglog

[logger_main]
level = DEBUG
handlers =
qualname = main

[handler_debuglog]
class = handlers.RotatingFileHandler
args = ('%(here)s/__logs/pyramid_debug.log','a')
level = DEBUG
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-8s [%(name)s][%(threadName)s] %(message)s

ma​​in.py

from bunch import Bunch
from redis import Redis
from rq import Queue, Worker
from helpers.rqworker import run_worker
from helpers.log import write_log

write_log('info', 'APP STARTED.')
q = Queue(connection=Redis())
req_obj = Bunch()
req_obj.remote_addr = self.request.remote_addr
job = q.enqueue(run_worker, req_obj, {'some_other': 'data'})
write_log('info', 'APP ENDED.')

helpers/rqworker.py

from helpers.log import write_log

def run_worker(req, data):
    write_log(req, 'debug', 'WORKER STARTED', separator=True)

helpers/log.py

import logging
log = logging.getLogger(__name__)


def write_log(request, loglevel, message=None, **kwargs):
    msg = '[{0}] {1}'.format(request.remote_addr, message)
    level = logging.getLevelName(loglevel.upper())

    if 'separator' in kwargs:
        log.log(level, '='*40)

    if message:
        log.log(level, msg)

    if 'stack' in kwargs:
        log.log(level, '{0} EXCEPTION {0}'.format('*'*15))
        log.log(level, kwargs['stack'])
        log.log(level, '{0} EXCEPTION END {0}'.format('*'*13))

当我运行我的应用程序时,我看不到来自 rqworker.py 的日志(可能是因为它是一个单独的线程)所以我想知道我如何(并且有可能)实现写入同一个日志文件?

【问题讨论】:

    标签: python multithreading logging pyramid python-multithreading


    【解决方案1】:

    这可能不再对 OP 有用,但我能够将 rq Worker 的输出重定向到自定义文件的方法是通过获取这样的记录器:

    logger = logging.getLogger('rq.worker')
    

    您可以向此记录器添加一个新的 FileHandler 以输出您的文件,并更改格式:

    h = logging.FileHandler("/path/to/logfile.log")
    formatter = logging.Formatter(...)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    

    但是,我无法删除输出的颜色,这会导致在文本编辑器中打开日志时,ANSI 颜色代码会略微杂乱。

    请注意,这会将日志记录删除到控制台。您也可以通过添加另一个处理程序来保留它。

    【讨论】:

    • 谢谢!我找不到这个 anywhere (特别是第一个代码块)。你是救生员。 FWIW 我将其作为使用 Docker Compose 运行的 FastAPI 项目的一部分运行。
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多