2016-02-18 3 views
2

У меня есть приложение python 2.5, которое создает отдельный поток для работы. Я хочу войти в файл, и я могу сделать это из основного потока, но когда я регистрируюсь из других потоков, он не работает.Ведение журнала не работает в отдельной теме

Это произойдет в основном потоке:

log_filename = os.path.join(os.path.dirname(__file__), "log", args[1]+'.log') 
logging.basicConfig(filename=log_filename, level=logging.DEBUG) 
logging.debug("Hello world!") # this works, line got written to a file 

Это как нить становятся инициализирован:

worker_thread = threading.Thread(target = MY_worker.MY_worker, args = tuple([task_queue])) 
worker_thread.start() 

Теперь из метода, который работает на потоке я делаю:

logging.debug("testing") # this doesnt got printed in the log file 

Я даже попробовал настроить журнал снова (внутри потока, прямо перед тем, как писать в журнал):

log_filename = os.path.join(os.path.dirname(__file__), "log", 'sandbox.log') 
logging.basicConfig(filename=log_filename, level=logging.DEBUG) 
logging.debug("testing") # doesn't works neither. 

Я попытался сочинительство непосредственно в файл, и он работал:

f = open(log_filename,'a') 
f.write('some testing message \n') 
f.close() 

Почему это происходит и как заставить его работать?

+0

Просьба представить [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) вашей проблемы, чтобы мы могли его отладить. –

+0

Попробуйте вызвать logging.getLogger() и передать результат в поток в списке аргументов. –

ответ

0

Вы уверены, что это не проблема, связанная с регистрацией? Следующий тривиальный скрипт ведет себя как ожидалось, как в Python 2.x, так и 3.x.

import logging 
import threading 
import time 

def worker(arg): 
    while not arg['stop']: 
     logging.debug('Hi from myfunc') 
     time.sleep(0.5) 

def main(): 
    logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s') 
    info = {'stop': False} 
    thread = threading.Thread(target=worker, args=(info,)) 
    thread.start() 
    while True: 
     try: 
      logging.debug('Hello from main') 
      time.sleep(0.75) 
     except KeyboardInterrupt: 
      info['stop'] = True 
      break 
    thread.join() 

if __name__ == '__main__': 
    main() 

При запуске он производит

 0 Thread-1 Hi from myfunc 
    1 MainThread Hello from main 
    502 Thread-1 Hi from myfunc 
    753 MainThread Hello from main 
    1003 Thread-1 Hi from myfunc 
    1504 Thread-1 Hi from myfunc 
    1505 MainThread Hello from main 
    2006 Thread-1 Hi from myfunc 
    2255 MainThread Hello from main 
    2507 Thread-1 Hi from myfunc 
    3007 MainThread Hello from main 
    3009 Thread-1 Hi from myfunc 
    3510 Thread-1 Hi from myfunc 
    3759 MainThread Hello from main 
    4012 Thread-1 Hi from myfunc 

, пока я не остановить его с помощью Ctrl-C.

Смежные вопросы