У меня есть простая программа командной строки, написанная на python. Программа регистрируется на экране с помощью модуля регистрации, настроенного следующим образом:
logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(message)s')
Странно то, что в моем ноутбуке программа регистрируется на нужном уровне (INFO) с нужным форматом, а когда я запускаю программу на сервере, программа регистрирует только ошибки и предупреждения в другом формате.
В обеих системах я запускаю Python 2.7 внутри виртуальной среды. Окружающая среда не совсем то же самое.
Я думаю, что какой-то модуль меняет мою конфигурацию. Я не понимаю, почему это происходит только на сервере, но есть ли способ найти какой?
Спасибо заранее,
API basicConfig()
при регистрации не будет делать ничего (как задокументировано), если корневой регистратор уже настроил обработчики. Ваш вызов basicConfig()
может игнорироваться, поскольку какой-либо другой код на сервере уже настроил некоторые обработчики для корневого регистратора.
В общем библиотечном коде не следует добавлять обработчики - ответственность разработчика приложения. Однако, если вы, например, разработка веб-приложения с использованием фреймворка, инфраструктура, возможно, уже настроила некоторые обработчики.
Вы говорите "на сервере", но неясно, говоришь ли вы о сервисном приложении или просто запускаете утилиту script на машине, которая является сервером. Как вы говорите, виртуальные envs немного отличаются, поэтому разница между ними может быть местом поиска подсказки.
Чтобы узнать, какие настройки обработчиков в корневом журнале, вы можете grep соответствующие источники для basicConfig()
или addHandler()
.
В качестве альтернативы вы можете явно добавить обработчик, а не полагаться на basicConfig()
, чтобы сделать это для вас:
f = logging.Formatter('%(levelname)-8s %(message)s')
h = logging.StreamHandler()
h.setFormatter(f)
logging.getLogger().addHandler(h)
но это может привести к появлению нескольких сообщений, если другие корневые обработчики также добавлены в корневой журнал.
Если вы считаете это определенным модулем, попробуйте заморозить код, используя cx_freeze или Py2exe. Это создаст и выполнит файл, и он поместит необходимые ему модули, поэтому он не будет зависеть от модулей в системе.
Конфигурация системы регистрации python уникальна в процессе python. Если кто-то изменит конфигурацию ведения журнала в процессе, все журналы, созданные в этом процессе, будут следовать этой конфигурации.