2016-10-05 1 views
4

У меня есть приложение Python колба, файл запись настраивает регистратор на приложение, например, так:Как я могу регистрироваться вне основного модуля Flask?

app = Flask(__name__) 
handler = logging.StreamHandler(sys.stdout) 
app.logger.addHandler(handler) 
app.logger.setLevel(logging.DEBUG) 

Я тогда сделать кучу протоколирования с использованием

app.logger.debug("Log Message")

, который работает отлично. Тем не менее, у меня есть несколько функций API, как:

@app.route('/api/my-stuff', methods=['GET']) 
def get_my_stuff(): 
    db_manager = get_manager() 
    query = create_query(request.args) 

    service = Service(db_manager, query) 
    app.logger.debug("Req: {}".format(request.url)) 

То, что я хотел бы знать, как я могу сделать вход в пределах этого Service модуля класса/питона. Должен ли я передать приложение к нему? Это похоже на плохую практику, но я не знаю, как получить дескриптор app.logger из-за главного файла Flask ...

+0

возможно дубликат http://stackoverflow.com/questions/22944387/configure-module-logger-to-flask-app-logger – CasualDemon

+0

Я видел этот вопрос, но ответ очень низок и не имеет для меня никакого смысла. – user4184113

ответ

4

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

НЕ пропускайте лесорубы. Вы всегда можете получить доступ к любому логгеру на logging.getLogger(<log name as string>). По умолчанию это выглядит так: * flask использует имя, которое вы предоставляете классу Flask.

Итак, если ваш основной модуль называется 'my_tool', вы должны сделать logger = logging.getLogger('my_tool') в модуле Service.

Чтобы добавить это, я хотел бы указать на то, что я назвал свои регистраторы и пакеты, поэтому я бы сделал Flask('my_tool') ** и в других модулях. logger = logging.getLogger('my_tool.services'), что все используют один и тот же корневой журнал (и обработчики).

* Опыт нет, основываясь на другом ответе.

** Опять же, не использовать флягу, дк, если это хорошая практика

Edit: Супер простой глупый пример

Главная Колба приложение

import sys 
import logging 

import flask 

from module2 import hi 

app = flask.Flask('tester') 

handler = logging.StreamHandler(sys.stdout) 
handler.setFormatter(logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')) 
app.logger.addHandler(handler) 
app.logger.setLevel(logging.DEBUG) 

@app.route("/index") 
def index(): 
    app.logger.debug("TESTING!") 
    hi() 
    return "hi" 

if __name__ == '__main__': 
    app.run() 

module2

import logging 

log = logging.getLogger('tester.sub') 


def hi(): 
    log.warning('warning test') 

Выходы

127.0.0.1 - - [04/Oct/2016 20:08:29] "GET /index HTTP/1.1" 200 - 
2016-10-04 20:08:29,098 - tester - DEBUG - TESTING! 
2016-10-04 20:08:29,098 - tester.sub - WARNING - warning test 

Edit 2: Мессинг с subloggers

Полностью ненужными, просто для общего знания.

Определив дочерний регистратор, выполнив добавление .something после имени корневого регистратора в logging.getLogger('root.something'), он дает вам базовое другое пространство имен для работы.

Мне лично нравится использовать его для группировки функций при регистрации. Поэтому у вас есть .tool или .db, чтобы узнать, какой тип кода регистрируется. Но это также позволяет так, что у этих дочерних регистраторов могут быть свои собственные обработчики.Поэтому, если вы хотите, чтобы часть вашего кода печаталась до stderr, или в журнал, вы можете это сделать. Вот пример с измененным module2.

module2

import logging 
import sys 

log = logging.getLogger('tester.sub') 
handler = logging.StreamHandler(sys.stderr) 
handler.setFormatter(logging.Formatter('%(name)s - %(levelname)s - %(message)s')) 
log.addHandler(handler) 
log.setLevel(logging.INFO) 


def hi(): 
    log.warning("test") 

Выход

127.0.0.1 - - [04/Oct/2016 20:23:18] "GET /index HTTP/1.1" 200 - 
2016-10-04 20:23:18,354 - tester - DEBUG - TESTING! 
tester.sub - WARNING - test 
2016-10-04 20:23:18,354 - tester.sub - WARNING - test 
+0

Один вопрос - какая часть в тесте.sub? Подполе называется подмодуль? – user4184113

+0

Нет, это все, что вы хотите, установить в 'logging.getLogger ('tester.sub')' в 'module2'. Это буквально строка, которую я поставил наугад, однако, поскольку это был «тестер» перед «.sub», он использует те обработчики, которые установлены в главном приложении. Чтобы получить фантазию, вы также можете назначить дополнительные обработчики, которые влияют только на этот подзаголовок в 'module2'. – CasualDemon

+0

@ user4184113 добавила информацию о дочерних регистраторах в свой ответ для вас. Это действительно не нужно для того, что вы ищете, просто веселое знание для обмена. – CasualDemon

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