我有一个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}$
您可以尝试通过参数(args)向线程传递一个log变量。在
关于日志记录需要注意的一件事是,如果在发出日志事件时发生异常(无论出于什么原因),则通常会将异常吞并,并且不允许仅仅因为日志错误而导致应用程序关闭。(它取决于使用的处理程序和
logging.raiseExceptions
的值)。所以有几件事需要检查:log.getEffectiveLevel()
,看看日志记录的详细程度是否已经被调低(不太可能是关键的,但您永远不知道)。在如果将print语句与log语句放在一起,它们是否按预期生成输出?在
更新:我知道mod\wsgi和打印的限制,但这只适用于
sys.stdout
。你可以例如或者
^{pr2}$没有任何问题。在
另外:您应该知道,调用
logging.config.fileConfig()
(这大概就是您所描述的配置的实现方式)会禁用任何现有的日志记录器,除非它们在配置文件中显式命名,或者是在配置文件中显式命名的记录器的后代。虽然这看起来很奇怪,这是因为一个配置旨在替换任何现有的配置,而不是扩充它;而且由于线程可能指向现有的记录器,所以它们被禁用而不是删除。您可以检查记录器的disabled
属性,查看fileConfig()
是否禁用了记录器,这可能是您的问题所在。在相关问题 更多 >
编程相关推荐