2016-01-04 6 views
2

У меня есть пакет Python, который я распространяю как один исполняемый файл с помощью PyInstaller.Пользовательский обработчик регистрации и форматирование с PyInstaller

Я использую модуль logging в сочетании с конфигурацией на основе файлов. Для реализации централизованного облачного ведения журнала я решил использовать модули loggly-python-handler и python-json-logger для отправки информации журнала в loggly. Последнее преобразует сообщение журнала в JSON, первое отправляет сообщение журнала (JSON) в Loggly, используя вызов HTTP (S).

Отрывок из моей конфигурации протоколирования (фактическое TOKEN значение было удалено, конечно):

[handler_loggly] 
class=loggly.handlers.HTTPSHandler 
formatter=json 
args=('https://logs-01.loggly.com/inputs/TOKEN/tag/test','POST') 
level=CRITICAL 

[formatter_json] 
format= %(name)s %(asctime)s %(filename)s %(created)f %(funcName)s %(levelno)s %(lineno)d %(msecs)d %(levelname)s %(message)s 
class=pythonjsonlogger.jsonlogger.JsonFormatter 

Это прекрасно работает при его запуске на компьютере, где установлен Python (и необходимые библиотеки). Тем не менее, исполняемый файл, созданный PyInstaller, по-видимому, не содержит необходимых модулей регистрации (поскольку они не импортируются нигде в исходном коде, просто упоминаются в конфигурации ведения журнала).

выход Ошибка при запуске исполняемого файла:

Traceback (most recent call last): 
    File "c:\python35\lib\logging\config.py", line 98, in _resolve 
AttributeError: module 'pythonjsonlogger' has no attribute 'jsonlogger' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<string>", line 64, in <module> 
    File "<string>", line 41, in main 
    File "<string>", line 28, in init_logger 
    File "c:\python35\lib\logging\config.py", line 76, in fileConfig 
    File "c:\python35\lib\logging\config.py", line 123, in _create_formatters 
    File "c:\python35\lib\logging\config.py", line 100, in _resolve 
ImportError: No module named 'pythonjsonlogger.jsonlogger' 
main returned -1 

Покушение 1

Я попытался с помощью PyInstaller-х hidden import functionality ссылаться на оба модуля: выходной файл

pyinstaller \ 
--log-level=DEBUG \ 
--onefile \ 
--hidden-import=loggly \ 
--hidden-import=pythonjsonlogger main.py 

Log:

3463 DEBUG: Hidden import: loggly 
3463 INFO: Analyzing hidden import 'loggly' 
3463 DEBUG: Hidden import: pythonjsonlogger 
3478 INFO: Analyzing hidden import 'pythonjsonlogger' 

Покушение 2

Пробовал указать импорт в спецификации файле PyInstaller (в отрывок ниже):

a = Analysis(['main.py'], 
      pathex=['C:\\Dev\\pyWebiExport'], 
      binaries=None, 
      datas=None, 
      hiddenimports=['loggly.handlers.*', 'pythonjsonlogger.jsonlogger.*'], 
      hookspath=None, 
      … 

Log выходного файла:

3510 DEBUG: Hidden import: loggly.handlers.* 
3510 INFO: Analyzing hidden import 'loggly.handlers.*' 
5694 ERROR: Hidden import 'loggly.handlers.*' not found 
5694 DEBUG: Hidden import: pythonjsonlogger.jsonlogger.* 
5694 INFO: Analyzing hidden import 'pythonjsonlogger.jsonlogger.*' 
5709 ERROR: Hidden import 'pythonjsonlogger.jsonlogger.*' not found 

Версия информация:

  • Python 3.5.1 (Windows, x86)
  • PyInstaller 3.0
  • Python-JSON-регистратор (0.1.4)
  • loggly-Python-обработчик (1.0.0)

ответ

1

Я был в состоянии решить эту проблему, написав runtime hook для PyInstaller, который в основном состоит из дополнительного сценария Python со следующим содержимым:

import pythonjsonlogger.jsonlogger 
import loggly.handlers 

я сохраняла эти заявления в файле loggly_hook.py и побежал PyInstaller со следующими аргументами:

pyinstaller \ 
--log-level=DEBUG \ 
--onefile \ 
--clean \ 
--runtime-hook=loggly_hook.py main.py 

PyInstaller выхода журнала:

10374 INFO: Analyzing run-time hooks ... 
10389 INFO: Including custom run-time hook 'loggly_hook.py' 
Смежные вопросы