如何在redis worker中使用python日志记录?

9rbhqvlz  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(451)

我有一个flask应用程序,redis worker(worker.py)在后台运行。有一个单独的模块(selenium.py)运行selenium来完成一些任务。此模块通过redis排队以执行作业。我正在尝试将所有进程记录到一个文件中。但是,redis将(selenium.py)中的所有日志打印到控制台中,而不是将它们放入我指定的日志文件中。
日志配置位于主文件(app.py)中:

import logging
from logging.handlers import RotatingFileHandler
import logging.config
from rq import Queue
from rq.job import Job
from worker import conn

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('app')
logger.warning('Started app.py!')

工人.py:

import os
import redis
from rq import Worker, Queue, Connection

listen = ['default']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(list(map(Queue, listen)))
        worker.work()

selenium .py

import logging

logger = logging.getLogger('app')
logger.info('Selenium ran successfully!')

...Selenium Code Here...

日志记录.conf

[loggers]
keys=root

[handlers]
keys=logfile

[formatters]
keys=logfileformatter

[logger_root]
level=INFO
handlers=logfile

[handler_logfile]
class=handlers.RotatingFileHandler
level=NOTSET
args=('logs/my_log.log','a',100000,50)
formatter=logfileformatter

[formatter_logfileformatter]
format=%(asctime)s %(name)-12s: %(levelname)s %(message)s

控制台输出(对于worker.py):

Selenium ran successfully!

日志输出:

Started app.py!

预期的日志输出(我想要的):

Started app.py!
Selenium ran successfully!

所以给了 flask 和redis。如何使用python的日志系统将日志合并到一个输出文件中?

ippsafx7

ippsafx71#

这是我提出的解决办法。
flask (或app.py):

import logging.config
from logsetup import LOGGING_CONFIG

logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger(__name__)
logger.warning('Started app.py!')

在logsetup.py中(您可以在这里调整格式并为不同的文件添加处理程序):

LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': True,
    'loggers': {
        '': {  # root logger
            'level': 'INFO',
            'handlers': ['info_rotating_file_handler'],
            'propagate': False
        }
    },
    'handlers': {
        'info_rotating_file_handler': {
            'level': 'INFO',
            'formatter': 'info',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/info.log',
            'mode': 'a',
            'maxBytes': 100000,
            'backupCount': 20
        }
    },
    'formatters': {
        'info': {
            'format': '[%(asctime)s] %(levelname)s [%(name)s::%(module)s.%(funcName)s:%(lineno)d] %(message)s',
            'datefmt': '%m-%d-%Y@%H:%M:%S'
        }
    }
}

现在有魔法了
对于通过flask导入并通过flask运行的模块,请转到模块并插入以下代码:

import logging

logger = logging.getLogger(__name__)
logger.info('Started MODULE_NAME_HERE.py!') #MODULE_NAME_HERE is just a placeholder. Such as your Scraper.py

对于与flask分开运行的模块,例如worker.py:

import logging
import logging.config
from logsetup import LOGGING_CONFIG

logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger(__name__)
logger.info('Started worker.py!')

我不认为这是解决你问题的最好办法,但我不确定是否是。我只是相信这至少是一种在登录到一个中心文件时并行运行许多python应用程序的好方法。

相关问题