如何将SQLAlchemy日志仅输出到文件

11

根据我在SQLAlchemy日志记录文档中阅读到的内容,我了解到sqlalchemy.create_engine的echo参数控制是否将SQLAlchemy日志记录强制输出到标准输出(stdout),但不应影响是否将日志消息提供给日志处理程序。

在下面的代码中,如果echo=False,则不会将任何内容输出到stdout或db.log; 如果echo=True,则会同时向stdout和db.log输出内容。 我希望在db.log仍然被填充的情况下不要有stdout输出。 该如何实现?

这是Python 2.7.6和SQLAlchemy 0.9.9。

import sqlalchemy
import logging

active_db_url = 'postgres://user:pass@localhost/log_test'

db_log_file_name = 'db.log'
db_log_level = logging.INFO

db_handler = logging.FileHandler(db_log_file_name)
db_handler.setLevel(db_log_level)

db_logger = logging.getLogger('sqlalchemy')
db_logger.addHandler(db_handler)

engine = sqlalchemy.create_engine(active_db_url, echo=True)
engine.connect()

**编辑已解决** db_logger需要设置其日志级别,而不仅仅是db_handler。

import sqlalchemy
import logging

active_db_url = 'postgres://user:pass@localhost/log_test'

db_log_file_name = 'db.log'
db_handler_log_level = logging.INFO
db_logger_log_level = logging.DEBUG

db_handler = logging.FileHandler(db_log_file_name)
db_handler.setLevel(db_handler_log_level)

db_logger = logging.getLogger('sqlalchemy')
db_logger.addHandler(db_handler)
db_logger.setLevel(db_logger_log_level)

engine = sqlalchemy.create_engine(active_db_url, echo=False)
engine.connect()

我想我已经弄清楚了。Logger 也需要一个 logLevel。请参见上面的编辑。 - Jobu
当我在打这个的时候,它已经被证实了。Michael Bayer 在 SQLAlchemy 邮件列表上解决了这个问题。https://groups.google.com/forum/#!topic/sqlalchemy/i699GUgxouo - Jobu
仅设置日志级别即可:db_logger.setLevel(logging.INFO)。处理程序只是用于处理(写入)消息。 - giwyni
1个回答

5

首先创建一个文件句柄以写入日志。

handler = logging.FileHandler('app.log')
handler.setLevel(logging.DEBUG)

获取SQLAlchemy记录器并添加此处理程序。
logging.getLogger('sqlalchemy').addHandler(handler)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接