2015-12-28 5 views
0

Я использую свой собственный класс логгера в своих проектах freelance для доступа к журналам через ftp и проверки ошибок. Он записывает отдельный файл для каждого процесса, который выводит на stdout через функцию os.getpid(). Это полезно для библиотеки мультипроцессов python. Но я делаю многопоточность чаще, чем многопроцессорность, и я не знаю, как улучшить свой код, чтобы написать отдельный файл для каждого потока, который выводит на stdout.класс python logger для многопоточности

class Logger(object): 
    def __init__(self, realstdout, path='logs/'): 
     today = datetime.datetime.now().isoformat() 
     if path[-1] != '/': 
      path = path+'/' 
     os.mkdir(path + today) 

     self.pid = str(os.getpid()) 
     self.handler = open(path + today + '/' + self.pid + '.txt', 'w', buffering=0) 
     self.stdout = realstdout 

    def write(self, buf): 
     if buf == '\n' or buf == '(Pdb)': 
      return 
     buf = buf.replace('\n', '#') 
     self.handler.write("[{0}] [{1}] ".format(datetime.datetime.today(), self.pid) + buf + "\n") 
     self.stdout.write("[{0}] ".format(self.pid) + buf + "\n") 

    def flush(self): 
     pass 

    def __del__(self): 
     self.handler.close() 

Как это сделать?

ответ

0

Если используется та же стратегия, регистрируя отдельный файл журнала для каждого рабочего, то для каждого потока должен быть какой-то идентификатор. Поскольку каждый поток выполняется в одном процессе, все они имеют одинаковый идентификатор процесса.

Я считаю, что вы могли бы использовать нить идент для его идентификации:

>>> threading.current_thread() 
<_MainThread(MainThread, started 139944996378368)> 
>>> threading.current_thread().ident 
139944996378368 

при нарезке известно регистратор может быть в состоянии создать уникальный идентификатор с:

self.pid = str(threading.current_thread().ident)

+0

Хорошая идея, но на самом деле метод журналирования, вызванный из основного потока. В то время как я выводил из него: <_MainThread (MainThread, начато 139944996378368)> – academica

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