How to list all existing loggers using python.logging module
Asked Answered
L

3

169

Is there a way in Python to get a list of all defined loggers?

I mean, does something exist such as logging.getAllLoggers() which would return a list of Logger objects?

I searched the python.logging documentation but couldn't find such a method.

Lindbergh answered 11/11, 2018 at 13:38 Comment(2)
similar: https://mcmap.net/q/130489/-how-to-print-current-logging-configuration-used-by-the-python-logging-moduleBrashear
since python 3.12 there is logging.getLogger().getChildren()Ours
T
279

Loggers are held in a hierarchy by a logging.Manager instance. You can interrogate the manager on the root logger for the loggers it knows about.

import logging

loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict]

Calling getLogger(name) ensures that any placeholder loggers held by loggerDict are fully initialized when they are added to the list.

Thickleaf answered 11/11, 2018 at 15:9 Comment(4)
In fact, getting the dict of Logger per name is better than simply a list of Logger alone, so logging.root.manager.loggerDict was exactly what I was searching for, thank you!Lindbergh
A small note here is that root logger is not returned by this snippet.Aurignacian
Anyone has an explanation about why PyCharm's linting warns about this snippet: Unresolved attribute reference 'manager' for class 'RootLogger'? I know it can be easily disabled, but still...Faveolate
Note you can access the manager from any logger, i.e. my_logger.manager is logging.root.manager. From the source: "There is [under normal circumstances] just one Manager instance ..."Brashear
R
40

If you want to include RootLogger in the list as well, do something similar to:

import logging
loggers = [logging.getLogger()]  # get the root logger
loggers = loggers + [logging.getLogger(name) for name in logging.root.manager.loggerDict]

tested on Python 3.7.4

Ramachandra answered 24/2, 2020 at 18:13 Comment(1)
This was what solved it for me: the missing root logger was the source of all the problems I had.Radom
K
12

If you are trying to examine the hierarchy of logging objects, I'd recommend using logging_tree.printout():

import logging_tree

logging_tree.printout()

Or, if you want to have the logging tree accessible to your code:

logging_tree.tree()

See https://pypi.org/project/logging_tree/ for more info.

Kinfolk answered 6/4, 2022 at 18:4 Comment(1)
I would have preferred to do it without depending on a third party library, but thank you for the link :)Lindbergh

© 2022 - 2024 — McMap. All rights reserved.