简体   繁体   English

使用Pyramid和rq写入相同的日志文件

[英]Writing to same log file with Pyramid and rq

I am using Pyramid and rq and I would like to log rq worker jobs in the same file as my Pyramid application. 我正在使用Pyramid和rq ,我想将rq worker作业记录在与Pyramid应用程序相同的文件中。

My setup looks like this: 我的设置如下:

development.ini 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

main.py main.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 助手/ rqworker.py

from helpers.log import write_log

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

helpers/log.py 助手/ 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))

When I run my app, I cannot see logs from rqworker.py (probably because it is a separate thread) so I'm wondering how can I (and is it possible to) achieve writing to same log file? 当我运行我的应用程序时,我看不到来自rqworker.py日志(可能是因为它是一个单独的线程)所以我想知道我怎么能(并且有可能)实现写入相同的日志文件?

This is probably not useful to the OP anymore, but the way I've been able to redirect the output of a rq Worker to a custom file is by getting the logger like this: 这可能对OP没有用了,但是我能够将rq Worker的输出重定向到自定义文件的方法是通过这样获取记录器:

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

You can add a new FileHandler to this logger that outputs on your file, and change the formatting too: 您可以将新的FileHandler添加到您的文件输出的此记录器中,并更改格式:

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

I haven't been able to remove the colouring of the output, though, which causes the log, when opened in a text editor, to be slightly cluttered with ANSI color codes. 但是,我无法删除输出的颜色,这会导致日志在文本编辑器中打开时,会使用ANSI颜色代码稍微混乱。

Note that this removes the logging to the console. 请注意,这会删除到控制台的日志记录。 You can probably keep that too by adding another handler. 您可以通过添加另一个处理程序来保留它。

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

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