как предотвратить регистрацию werkzeug

Я использую флягу и werkzeug. Чтобы отслеживать операторы sql, испускаемые sqlalchemy, я настроил регистратор logging.basicConfig() и прикрепил событие before_cursor_execute для мониторинга операторов SQL. Но теперь werkzeug также прикрепляет ведение журнала к этому регистратору, это не то, что я хочу. поэтому мой журнал выглядит так... (сообщение werkzeug не требуется)

INFO:root:SELECT anon_1.heartbeat_id AS anon_1_heartbeat_id
FROM (SELECT heartbeat.id AS heartbeat_id FROM heartbeat ORDER BY stamp desc LIMIT ?
OFFSET ?) AS anon_1 ORDER BY heartbeat_name
INFO:werkzeug:127.0.0.1 - - [13/Jun/2013 12:10:52] "GET / HTTP/1.1" 200 -

В документации werkzeug я ничего не могу найти о ведении журнала. И вот код, который я использую.

logging.basicConfig(filename='sql.log', level=logging.INFO)
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
    logging.info(statement)
event.listen(engine, "before_cursor_execute", before_cursor_execute)

person Paul    schedule 13.06.2013    source источник


Ответы (2)


Вместо этого попробуйте что-то вроде этого (непроверено):

import logging
logger = logging.getLogger('sql')
logger.addHandler(logging.StreamHandler('sql.log'))
logger.setLevel(logging.INFO)

def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
    logger.info(statement)
event.listen(engine, "before_cursor_execute", before_cursor_execute)

Что вы делаете, так это просто создаете другой регистратор, чтобы они не смешивались, это должно решить ваши проблемы :)

person Wolph    schedule 13.06.2013
comment
ясно, werkzeug использует глобальное ведение журнала, я должен держаться подальше от этого - person Paul; 13.06.2013

Sqlalchemy использует регистратор sqlalchemy.engine. Чтобы настроить его, вы можете сделать следующее:

lg = logging.getLogger('sqlalchemy.engine')
lg.setLevel(logging.INFO)

lh = logging.StreamHandler()
lh.setFormatter(logging.Formatter('YOUR FORMAT HERE'))

lg.add_handler(lh)

После этого вы можете использовать

logging.getLogger('sqlalchemy.engine')
logging.info('your sql statement')
person Mein Usr    schedule 13.06.2013
comment
Это полезная информация, я не знал, как подключиться к протоколированию, которое использует sqlalchemy. - person Paul; 13.06.2013