在单独的fi中记录SQLAlchemy

2024-04-24 04:51:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将我的SQL炼金术日志与我的自定义日志分开

LOG_LEVEL = 20
LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
logging.basicConfig(filename='my_log.log', format=LOG_FORMAT, level=LOG_LEVEL)

handler_sql = logging.FileHandler('my_alchemy_log.log')
handler_sql.setFormatter(logging.Formatter(LOG_FORMAT))
sql_logger = logging.getLogger('sqlalchemy.engine')
sql_logger.setLevel(LOG_LEVEL)
sql_logger.addHandler(handler_sql)

logger = logging.getLogger(__name__)
logger.info("this belongs to my_log")

s = sessionmaker(bind=create_engine(CONN_STRING, poolclass=NullPool))
result = s.query(SomeTableModel).filter_by(**kwargs).first()
s.close()

发生的是两个文件被创建,它们看起来像下面的

我的_日志.log

^{pr2}$

我的炼金术_日志.log

2018-10-24 23:35:01,650 sqlalchemy.engine.base.Engine INFO SHOW VARIABLES LIKE 'sql_mode'
2018-10-24 23:35:01,650 sqlalchemy.engine.base.Engine INFO {}
2018-10-24 23:35:01,689 sqlalchemy.engine.base.Engine INFO SELECT DATABASE()
2018-10-24 23:35:01,689 sqlalchemy.engine.base.Engine INFO {}
2018-10-24 23:35:01,725 sqlalchemy.engine.base.Engine INFO SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2018-10-24 23:35:01,725 sqlalchemy.engine.base.Engine INFO {}
2018-10-24 23:35:01,742 sqlalchemy.engine.base.Engine INFO SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2018-10-24 23:35:01,743 sqlalchemy.engine.base.Engine INFO {}
2018-10-24 23:35:01,756 sqlalchemy.engine.base.Engine INFO BEGIN (implicit)
2018-10-24 23:35:01,770 sqlalchemy.engine.base.Engine INFO SELECT ..............

查询在我的_日志.log也是!这是意料之中的!!! 我们期待的是_日志.log只应包含“这属于我的日志”,不包含查询。查询只能以我的炼金术结束_日志.log


Tags: infologformatsqlbasesqlalchemyloggingas
1条回答
网友
1楼 · 发布于 2024-04-24 04:51:59

你能做到的

sql_logger.propagate = False

它将停止将记录在那里的事件传播到祖先记录器的处理程序(因此根日志记录器写入my_log.log)。在

要从my_log.log关闭allSQLAlchemy日志记录(不仅仅来自sqlalchemy.engine),您可能需要这样做

^{pr2}$

propagate标志被记录为here。在

相关问题 更多 >