Вращение файла журнала не работает, когда код Python запускается из службы Windows - PullRequest
1 голос
/ 16 марта 2019

Я запускаю приложение python (версия exe, созданная с помощью pyInstaller) из службы Windows (созданной в python, преобразованной в exe с помощью pyinstaller и установленной с помощью sc), но файлы журнала, созданные моим приложением, не вращаются.

Итак, я фактически использовал файл logger.conf, который имеет конфигурацию логгера с вращением FileHandler, чтобы вращать файл после каждых 10 КБ (для целей тестирования).Конфигурация в файле conf выглядит следующим образом:

...
[handler_fileRotationHandler]
class=logging.handlers.RotatingFileHandler
level=NOTSET
formatter=simpleFormatter
args=('<absolute path of log file>','a',10240,5)
...

Внутри кода Python я использую эту конфигурацию для создания и поворота файлов журнала.

Вот список случаев, когда работает правильная ротация файла журнала:

1- Версия python запущена с использованием команды python
2- Версия exe (созданас использованием PyInstaller) отлично работает при двойном щелчке мыши напрямую
3- версия exe при запуске из службы Windows, также созданной в python, если служба установлена ​​с помощью команд python, как показано ниже:

MyService.py install

Теперь вот когда это не работает:
Я конвертирую код службы Windows в exe (снова использую pyInstaller) и устанавливаю службу с помощью команды sc, используя следующую команду:

sc create MyService binPath= "<absolute path of service exe file>"

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

Вот что я пробовал и наблюдал:
1- В обоих случаях я запустил свойверсия приложения exe с использованием команды subprocess.Popen (), и мое приложение не имеет какого-либо элемента пользовательского интерфейса, поэтому оно отлично работает в сеансе Windows 0 в фоновом режиме.Просто для информации, в случае, если это уместно.
2- Если я удаляю существующие операторы журнала и пустой файл журнала, журналы начинают регистрироваться в файле и снова останавливаются при достижении максимального размера.
3- У меня естьиспользовал команду os.getcwd (), чтобы получить каталог, в котором мое приложение запускается при запуске, в обоих случаях, для которых я нашел следующие каталоги:

в службе python, установленной с использованием случая python, приложение запускается в "C: \ Users \\AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ win32 "

, в то время как в версии exe, запущенной из службы, установленной с использованием сценария sc, приложение работает в" C: \ Windows \ system32 "

Хотя в обоих случаях файл logging.conf содержит путь создания файла журнала, поэтому я предполагаю, что это не должно быть проблемой (фактически файл журнала создается в ожидаемом месте, просто ротация файлов не работает,так что это, я думаю, не имеет значения)

Мне нужно использовать версию exe, установленную только sc, а не версию службы python.Как решить эту проблему, любая помощь или руководство или направление приветствуется.

1 Ответ

0 голосов
/ 14 июня 2019

[Для всех, кто хочет узнать решение]

Итак, проблема, с которой я столкнулся, является распространенной в RotationFileHandler, который состоит из двух обработчиков, работающих с одним файлом одновременно, что препятствует RotationFileHandler переименовывать заполненный файл журнала.

Чтобы уточнить выше, я поместил обработку исключений в исходный код RotationFileHandler в handler.py и напечатал исключение в файл. Оттуда я получил вопрос как:

...
[WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\<path to log>\\test.log' -> 'C:\\Users\\<path to log>\\test.log.1'
...

При поиске больше, я обнаружил, что это общий сценарий с FileRotationHandler в логгере в окнах, где иногда несколько дескрипторов открыты для одного и того же файла журнала по многим возможным причинам и, таким образом, обработчик файла ротации не может переименовать файл.

наткнулся на эту ветку, объясняющую множество возможных сценариев

Я использовал инструмент procxp, чтобы проверить, не содержит ли мой файл журнала несколько дескрипторов (открытых другими приложениями). Я обнаружил, что, поскольку я использовал один и тот же файл logging.conf как для служебного кода, так и для кода приложения, у них обоих были открытые дескрипторы для регистрации файлов для обоих. Я создал отдельный файл конфигурации для служебного кода, и проблема исчезла. :)

Единственное, что мне еще не известно, это то, почему это происходило только в exe-версиях и сервиса, и приложения, а не в версиях python, потому что в идеале проблема должна возникать при запуске как кода python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...