err*_*ata 5 python logging multithreading python-multithreading pyramid
我正在使用 Pyramid 和rq,我想将 rq 工作作业记录在与我的 Pyramid 应用程序相同的文件中。
我的设置如下所示:
开发文件
# 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
Run Code Online (Sandbox Code Playgroud)
主文件
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.')
Run Code Online (Sandbox Code Playgroud)
助手/rqworker.py
from helpers.log import write_log
def run_worker(req, data):
write_log(req, 'debug', 'WORKER STARTED', separator=True)
Run Code Online (Sandbox Code Playgroud)
帮手/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))
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序时,我看不到来自rqworker.py
(可能是因为它是一个单独的线程)的日志,所以我想知道我如何(并且有可能)实现写入相同的日志文件?
这可能对OP不再有用,但是我能够将rq Worker的输出重定向到自定义文件的方法是通过获取如下记录器:
logger = logging.getLogger('rq.worker')
Run Code Online (Sandbox Code Playgroud)
您可以向此记录器添加一个新的 FileHandler 以在文件上输出,并更改格式:
h = logging.FileHandler("/path/to/logfile.log")
formatter = logging.Formatter(...)
fh.setFormatter(formatter)
logger.addHandler(fh)
Run Code Online (Sandbox Code Playgroud)
不过,我无法删除输出的颜色,这导致日志在文本编辑器中打开时,ANSI 颜色代码稍微混乱。
请注意,这会删除控制台的日志记录。您也可以通过添加另一个处理程序来保留它。
归档时间: |
|
查看次数: |
1511 次 |
最近记录: |