2013-09-29 2 views
1

Я написал это с помощью из кулинарной книги регистрации here этот код должен был писать строку для каждого «устройства». Он создает файлы журнала, но внутри ничего не написано.класс, основанный на методе timerotatingfilehandler, ничего не пишет в журналах

#!/usr/bin/env python 

from __future__ import unicode_literals 

import json 
import logging 
import glob 
import logging.handlers 

# This next bit is to ensure the script runs unchanged on 2.x and 3.x 
try: 
    unicode 
except NameError: 
    unicode = str 

class LogWriter: 
    Name = 'LogWriter' 
    def __init__(self, Device_ID, Severity, Message): 
     self.id = Device_ID 
     self.severity = Severity 
     self.message = Message 
     self.logfile = './log/log_'+self.id+'.log' 

    def log(self): 
     # Set up a specific logger with our desired output level 
     logwriter = logging.getLogger('LogWriter') 
     logwriter.setLevel(logging.INFO) 

     # Add the log message handlers to the logger 
     timedRotatingLogFileHandler = logging.handlers.TimedRotatingFileHandler(self.logfile, when = 'midnight', backupCount=2) 
     #setup formatting 
     formatter = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s') 
     timedRotatingLogFileHandler.setFormatter(formatter) 
     logwriter.addHandler(timedRotatingLogFileHandler) 

     try: 
      logging.info(self.message, self.severity) 
     except: 
      return 1 
     return 0 

def main(): 
    for i in range(20): 
     logger = LogWriter(str(i), 'INFO', 'hello'+str(i)) 
     logger.log() 


if __name__ == '__main__': 
    main() 

Может ли кто-нибудь сказать мне, почему это не работает?

+0

только что увидел, что ссылка, которую я дал, была документацией 3.x, и что этот вопрос получил тег для python-3.x - я на самом деле запущен 2.7 - это имеет значение. – demorphica

+0

добавлена ​​правильная ссылка на кулинарную книгу 2.7, так что путаница не создается – demorphica

+1

Я не вижу никакого журнала - logwriter.log (logging.INFO, self.message) или что-то вроде, только информация – cox

ответ

0

Оба cox и Vinay были правильными, но явное решение не было предоставлено. Решение cox не было полностью выполнено, потому что его предлагаемое определение жестко определяло бы серьезность, не позволяющую изменять вызовы

, поэтому я больше не передаю идентификатор устройства, серьезность и сообщение для класса, а непосредственно в журнал() функция

Это был самый простой способ, которым я получил это.

a = getattr(logwriter, severity) 
a(message) 

замена

logging.info(self.message, self.severity) 

передовой практики, чтобы не создавать обработчики внутри определения класса, как сказал Вини. Решение, которое я нашел для этого, состоит в том, чтобы определить отдельный модуль регистрации, прикрепить обработчики вне определения класса в модуле, создать новый журнал только один раз в вызывающей программе, а затем каждый новый запрос регистратора может войти в дочерний журнал, как объяснено в книжной кулинарной книге.

1

Вы добавляете обработчик в журнал регистрации LogWriter, но регистрируетесь в корневом журнале, в котором нет обработчиков.

Неправильная практика заключается в том, чтобы добавить обработчики и установить уровни, за исключением одного раза из пункта if __name__ == '__main__', на ваш код не совсем ясно, соблюдаете ли вы правильную практику.

+0

'logging.info (self.message, self.severity)' теперь изменен на 'a = getattr (logwriter, severity) a (сообщение)' и он работает – demorphica

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