2017-01-19 13 views
0

У меня есть сервер регистрации python, два тестовых приложения и один общий модуль (submod.py). Я хочу, чтобы оба приложения могли отправлять события журнала на сервер и иметь сервер как хранить их в отдельных файлах журнала. Это довольно легко до тех пор, пока общий модуль не начнет регистрироваться, я не знаю, как разрешить серверу определять, какая программа под модуль выполняет отправку событий журнала для хранения в правильный файл журнала.Python Logging - dictConfig - назначение протокола для вспомогательных модулей

Мой каротаж сервер представляет собой слегка измененный вариант кода я нашел here

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

test_log.conf

"handlers": { 
      "console": { 
       "class": "logging.StreamHandler", 
       "level": "DEBUG", 
       "formatter": "complex", 
       "stream": "ext://sys.stdout" 
      }, 
      "test_01": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_01.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "test_02": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_02.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "file": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "root.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      } 
     }, 
     "loggers": { 
      "root": { 
       "level": "INFO", 
       "handlers": ["console", "file"] 
      }, 
      "test_01":{ 
       "level": "INFO", 
       "handlers": ["console", "test_01"] 
      }, 
      "test_02": { 
       "level": "INFO", 
       "handlers": ["console", "test_02"] 
      } 
     } 

test_01.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 01 main program') 

a = submod.SubClass() 

test_02.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 02 main program') 

a = submod.SubClass() 

submod.py

class SubClass(object): 
    def __init__(self): 
     log = logging.getLogger() 
     log.debug('Debug') 
     log.info('Info') 
     log.warn('Warning') 
     log.error('Error') 
     log.critical('Critical') 
     print(__name__) 

Как я могу иметь сервер журналирования разумно знать, где регистрировать сообщения от submod.py, когда оба test_01 и test_02 называют это.

Приносим извинения за форматирование и запутанное объяснение, проблема вызвала у меня повреждение мозга в этот момент.

Отредактировано: Для наглядности и неправильной формулировки.

ответ

0

Просто используйте конфигурационный файл, в котором вы можете предопределить место назначения вашего файла ведения журнала на основе программы, которая его использует. Модуль «logging» Python выполняет все необходимые вам задачи; вот пример файла конфигурации: http://www.zetadev.com/software/aspen/trunk/doc/html/logging-conf.html

+0

Как я понимаю, конфигурация, на которую вы ссылаетесь, не решает проблему. Я пытаюсь иметь динамическую конфигурацию, которая может применяться к нескольким программам, которые используют одни и те же подмодули, но имеют разумное определение сервера, когда сообщение из подмодулей должно быть сохранено в файле журнала каждой основной программы. – Chex

+0

Получил, как насчет этого тогда? https://docs.python.org/2/howto/logging-cookbook.html#using-logging-in-multiple-modules – postoronnim

+0

Это может сработать, я надеялся повторно использовать модуль между приложениями, чтобы статически назначить родителя это немного боль. Есть ли способ определить «родителя», который вызвал или? Или мне нужно просто передать имя родителя, называя его переменной и установить его. – Chex

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

  • Нет связанных вопросов^_^