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.

Reply via email to