Ведение журнала флагов – не удается заставить его записать файл

Хорошо, вот код, где я настраиваю все:

if __name__ == '__main__': app.debug = False applogger = app.logger file_handler = FileHandler("error.log") file_handler.setLevel(logging.DEBUG) applogger.setLevel(logging.DEBUG) applogger.addHandler(file_handler) app.run(host='0.0.0.0') 

Что происходит

  • Python Flask: отслеживание пользовательских сеансов? Как получить идентификатор сеанса cookie?
  • Выполнять запрос POST при перенаправлении в колбе
  • Flask-Login не работает с двумя приложениями в одном домене
  • Запрос на фляжку и тип приложения / json
  • Динамическое использование шаблонов в Jinja2
  • sqlalchemy.exc.InterfaceError: <непечатаемый объект InterfaceError>
    1. error.log создается
    2. Ничего не написано на нем
    3. Несмотря на отсутствие добавления StreamHandler и отладку false, я все равно получаю все до STDOUT (это может быть правильно, но все же кажется странным)

    Я полностью здесь где-то или что происходит?

  • Вход в два файла с различными настройками
  • Использование DATEADD в sqlalchemy
  • Ошибка импорта моделей при попытке запустить приложение
  • как использовать QuerySelectField в колбе?
  • Сколько одновременных запросов получает один процесс в колбе?
  • Использование Flask, как мне изменить заголовок Cache-Control для вывода ALL?
  • 5 Solutions collect form web for “Ведение журнала флагов – не удается заставить его записать файл”

    Почему бы не сделать это так:

     if __name__ == '__main__': init_db() # or whatever you need to do import logging logging.basicConfig(filename='error.log',level=logging.DEBUG) app.run(host="0.0.0.0") 

    Если вы сейчас запустите приложение, вы увидите, что error.log содержит:

     INFO:werkzeug: * Running on http://0.0.0.0:5000/ 

    Для получения дополнительной информации посетите http://docs.python.org/2/howto/logging.html

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

     import logging, logging.config, yaml logging.config.dictConfig(yaml.load(open('logging.conf'))) 

    Теперь добавьте код отладки, чтобы мы увидели, что наша настройка работает:

     logfile = logging.getLogger('file') logconsole = logging.getLogger('console') logfile.debug("Debug FILE") logconsole.debug("Debug CONSOLE") 

    Все, что осталось, это программа «logging.conf». Давайте используем это:

     version: 1 formatters: hiformat: format: 'HI %(asctime)s - %(name)s - %(levelname)s - %(message)s' simple: format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' handlers: console: class: logging.StreamHandler level: DEBUG formatter: hiformat stream: ext://sys.stdout file: class: logging.FileHandler level: DEBUG formatter: simple filename: errors.log loggers: console: level: DEBUG handlers: [console] propagate: no file: level: DEBUG handlers: [file] propagate: no root: level: DEBUG handlers: [console,file] 

    Эта конфигурация более сложна, чем требуется, но также показывает некоторые функции модуля регистрации.

    Теперь, когда мы запускаем наше приложение, мы видим этот вывод (werkzeug- и console-logger):

     HI 2013-07-22 16:36:13,475 - console - DEBUG - Debug CONSOLE HI 2013-07-22 16:36:13,477 - werkzeug - INFO - * Running on http://0.0.0.0:5000/ 

    Также обратите внимание, что использовался пользовательский форматтер с «HI».

    Теперь посмотрим на файл "errors.log". Это содержит:

     2013-07-22 16:36:13,475 - file - DEBUG - Debug FILE 2013-07-22 16:36:13,477 - werkzeug - INFO - * Running on http://0.0.0.0:5000/ 

    Хорошо, моя неудача проистекала из двух неправильных представлений:

    1) Flask, по-видимому, игнорирует все пользовательские протоколирования, если он не работает в режиме производства

    2) debug = False недостаточно, чтобы запустить его в режиме производства. Вы должны обернуть приложение на любом сервере WSGI, чтобы сделать это

    После того, как я запустил приложение с сервера WSGI от gevent (и переместил инициализацию журнала в более подходящее место), все работает нормально

    Результат, который вы видите в консоли вашего приложения, находится из основного регистратора Werkzeug, к которому можно получить доступ через logging.getLogger ('werkzeug').

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

    Дополнительная информация и пример кода: Напишите запросы на фляж в журнал доступа .

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

     @app.before_first_request def initialize(): logger = logging.getLogger("your_package_name") logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter( """%(levelname)s in %(module)s [%(pathname)s:%(lineno)d]:\n%(message)s""" ) ch.setFormatter(formatter) logger.addHandler(ch) 

    Мое приложение структурировано подобно

     /package_name __main__.py <- where I put my logging configuration __init__.py <- conveniance for myself, not necessary /tests /package_name <- Actual flask app __init__.py /views /static /templates /lib 

    Следуя этим указаниям http://flask.pocoo.org/docs/0.10/patterns/packages/

    Это работает:

     if __name__ == '__main__': import logging logFormatStr = '[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s' logging.basicConfig(format = logFormatStr, filename = "global.log", level=logging.DEBUG) formatter = logging.Formatter(logFormatStr,'%m-%d %H:%M:%S') fileHandler = logging.FileHandler("summary.log") fileHandler.setLevel(logging.DEBUG) fileHandler.setFormatter(formatter) streamHandler = logging.StreamHandler() streamHandler.setLevel(logging.DEBUG) streamHandler.setFormatter(formatter) app.logger.addHandler(fileHandler) app.logger.addHandler(streamHandler) app.logger.info("Logging is set up.") app.run(host='0.0.0.0', port=8000, threaded=True) 
    Python - лучший язык программирования в мире.