or have your logger look for that "log_only" token in the logger name and skip on that, that's more future-proof.
On Wed, Feb 21, 2018 at 4:30 PM, Mike Bayer <[email protected]> wrote: > On Wed, Feb 21, 2018 at 2:34 PM, Stefan Schwarzer > <[email protected]> wrote: >> Thanks for the quick reply! >> >> On Wednesday, February 21, 2018 at 6:44:33 PM UTC+1, Mike Bayer wrote: >>> >>> I can come up with other things that can break based on the idea that >>> you're doing a full connection + execute sequence within the log >>> handler deep within that engine's own processes, such as, it can cause >>> connection pool exhaustion when you're working with the last >>> connection available, then your logger has no connection, it goes to >>> get one and...hang. I can reproduce this with your script (set >>> pool_size=1, max_overflow=0, set up logging and run an execute() so it >>> actually logs, and it hangs for 30 seconds until the timeout and >>> crashes, see stack trace below), so your approach is not safe in any >>> case. >> >> >> Thanks for the clarification. >> >>> >>> It would be a lot simpler and robust if your log handler just used its >>> own Engine (make a new one from the engine.url you already have). >> >> >> Good idea. >> >>> >>> That way you can lose all that re-entrant mutex stuff too. >> >> >> The mutex stuff is there because in the actual code SQLAlchemy logging is >> switched on and I want to prevent that SQLAlchemy tries to log the insert >> statement in `_emit`. I didn't think of this when I posted the original >> question, so I could have left out the mutex stuff for the sake of the >> example code. > > but it wont, if you disable your logger engine from actually logging: > > from sqlalchemy import create_engine > > import logging > logging.basicConfig() > > logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) > > e = create_engine("sqlite://") > e.scalar("select 1") > > print("no more logging") > e = create_engine("sqlite://", logging_name="log_only") > logging.getLogger("sqlalchemy.engine.base.Engine.log_only").setLevel(logging.WARN) > e.scalar("select 1") > > > the ".base" module in the path there is slightly non-standard but > shouldn't be changing anytime soon. > > >> >> Best regards, >> Stefan >> >> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
