登录从pylons应用程序派生的工作线程似乎不太合适

2024-09-29 17:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pylons应用程序,在这个应用程序中,在某些情况下,我希望生成多个工作线程来处理队列中的项目。现在我们没有使用线程池(这是理想的,但我们稍后会添加它)。主要问题是工作线程日志记录没有写入日志文件。在

当我在pylons应用程序之外运行代码时,日志记录工作得很好。所以我认为这和塔柱日志处理程序有关,但不确定是什么。在

下面是代码的一个基本示例(精简):

import logging
log = logging.getLogger(__name__)

import sys
from Queue import Queue
from threading import Thread, activeCount

def run(input, worker, args = None, simulteneousWorkerLimit = None):
    queue = Queue()
    threads = []

    if args is not None:
        if len(args) > 0:
            args = list(args)
            args = [worker, queue] + args
            args = tuple(args)
        else:
            args = (worker, queue)

    # start threads
    for i in range(4):
        t = Thread(target = __thread, args = args)
        t.daemon = True
        t.start()
        threads.append(t)

    # add ThreadTermSignal
    inputData = list(input)
    inputData.extend([ThreadTermSignal] * 4)

    # put in the queue
    for data in inputData:
        queue.put(data)

    # block until all contents are downloaded
    queue.join()
    log.critical("** A log line that appears fine **")

    del queue
    for thread in threads:
        del thread
    del threads

class ThreadTermSignal(object):
    pass

def __thread(worker, queue, *args):
    try:
        while True:
            data = queue.get()
            if data is ThreadTermSignal:
                sys.exit()
            try:
                log.critical("** I don't appear when run under pylons **")
            finally:
                queue.task_done()
    except SystemExit:
        queue.task_done()
        pass

请注意,RUN方法中的loglin将显示在日志文件中,但是worker方法中的日志行(在派生线程中运行)不会出现。任何帮助都将不胜感激。谢谢

**EDIT:我应该提到,我尝试过将“log”变量传递给worker线程,并在线程中重新定义一个新的“log”变量,但都没有成功。在

**EDIT:添加用于pylons应用程序的配置(来自INI文件)。下面的代码片段来自INI文件。在

^{pr2}$

Tags: 文件代码inimportlog应用程序dataqueue
2条回答

您可以尝试通过参数(args)向线程传递一个log变量。在

关于日志记录需要注意的一件事是,如果在发出日志事件时发生异常(无论出于什么原因),则通常会将异常吞并,并且不允许仅仅因为日志错误而导致应用程序关闭。(它取决于使用的处理程序和logging.raiseExceptions的值)。所以有几件事需要检查:

  • 日志消息的格式设置非常简单,可能只是使用%(message)s,直到找到问题为止。在
  • 检查塔架没有关闭日志记录,也没有因为任何原因与处理人员发生冲突。您还没有发布日志初始化代码,所以我不确定您使用的是什么处理程序等。您可以打印log.getEffectiveLevel(),看看日志记录的详细程度是否已经被调低(不太可能是关键的,但您永远不知道)。在

如果将print语句与log语句放在一起,它们是否按预期生成输出?在

更新:我知道mod\wsgi和打印的限制,但这只适用于sys.stdout。你可以例如

print >> sys.stderr, some_data

或者

^{pr2}$

没有任何问题。在

另外:您应该知道,调用logging.config.fileConfig()(这大概就是您所描述的配置的实现方式)会禁用任何现有的日志记录器,除非它们在配置文件中显式命名,或者是在配置文件中显式命名的记录器的后代。虽然这看起来很奇怪,这是因为一个配置旨在替换任何现有的配置,而不是扩充它;而且由于线程可能指向现有的记录器,所以它们被禁用而不是删除。您可以检查记录器的disabled属性,查看fileConfig()是否禁用了记录器,这可能是您的问题所在。在

相关问题 更多 >

    热门问题