Hello all,
I want that each module has its own logger. I've defined the following
config file:
[formatters]
keys=f01
[handlers]
keys=console
[loggers]
keys=root,l01
[formatter_f01]
format=%(name)s: %(message)s
[handler_console]
class=StreamHandler
args=[]
formatter=f01
[logger_root]
level=CRITICAL
handlers=console
[logger_l01]
level=DEBUG
qualname=l01
handlers=console
I use it like this:
import logging
import logging.config
logging.config.fileConfig('a.conf')
log = logging.getLogger('l01')
log.debug('zzz')
I want logger_root to go to /dev/null, so I've configured it with level
CRITICAL. My understanding is that in this way debug messages are not
printed on logger_root's handler. However, running the program results
in the message being printed twice. What is the problem?
Thanks in advance,
Baurzhan. 10 2627
Baurzhan Ismagulov wrote: Hello all,
I want that each module has its own logger. I've defined the following config file:
[logger_root] level=CRITICAL handlers=console
[logger_l01] level=DEBUG qualname=l01 handlers=console
I want logger_root to go to /dev/null, so I've configured it with level CRITICAL. My understanding is that in this way debug messages are not printed on logger_root's handler. However, running the program results in the message being printed twice. What is the problem?
You've defined the handler against both the root logger and l01. You
only need it configured for the root logger - events passed to l01 will
be passed to all handlers up the hierarchy. So remove the
"handlers=console" line from [logger_l01] and it should print the
message just once.
Vinay Sajip
Hello Vinay,
On Tue, May 23, 2006 at 04:13:38PM -0700, Vinay Sajip wrote: [logger_root] level=CRITICAL handlers=console
[logger_l01] level=DEBUG qualname=l01 handlers=console
I want logger_root to go to /dev/null, so I've configured it with level CRITICAL. My understanding is that in this way debug messages are not printed on logger_root's handler. However, running the program results in the message being printed twice. What is the problem?
You've defined the handler against both the root logger and l01. You only need it configured for the root logger - events passed to l01 will be passed to all handlers up the hierarchy. So remove the "handlers=console" line from [logger_l01] and it should print the message just once.
Thanks for the idea! I think this should work for the example I sent.
However, I have more than one module, and I want to log only l01. How
can I do that?
Thanks in advance,
Baurzhan.
Baurzhan Ismagulov wrote: Thanks for the idea! I think this should work for the example I sent. However, I have more than one module, and I want to log only l01. How can I do that?
I don't know what your logger hierarchy looks like: you could perhaps
log to child loggers of l01 ("l01.XXX"), or set all other loggers you
use to have a CRITICAL level, or filter them using a filter which
filters out everything.
Regards,
Vinay
Hello Vinay,
On Thu, May 25, 2006 at 10:14:00AM -0700, Vinay Sajip wrote: I don't know what your logger hierarchy looks like: you could perhaps log to child loggers of l01 ("l01.XXX"), or set all other loggers you use to have a CRITICAL level, or filter them using a filter which filters out everything.
Ok, here is my hierarchy:
[formatters]
keys=f01
[handlers]
keys=console
[loggers]
keys=root,l01,l02
[formatter_f01]
format=%(name)s: %(message)s
[handler_console]
class=StreamHandler
args=[]
formatter=f01
[logger_root]
level=CRITICAL
handlers=console
[logger_l01]
level=DEBUG
qualname=l01
handlers=console
[logger_l02]
level=CRITICAL
qualname=l02
handlers=console
The program is:
import logging
import logging.config
logging.config.fileConfig('a.conf')
log1 = logging.getLogger('l01')
log2 = logging.getLogger('l02')
log1.debug('zzz')
log2.debug('qqq')
With the config above, I expect that zzz gets printed, and qqq doesn't.
When I run the script, zzz is printed twice, and qqq isn't. I want that
zzz is printed once. How do I do that? I can add a filter if this can't
be done otherwise, however, I'm at the moment reluctant to do that since
I don't see why CRITICAL for root passes zzz through and drops qqq
correctly for l02.
Thanks in advance,
Baurzhan.
Baurzhan Ismagulov wrote: Hello Vinay, Ok, here is my hierarchy:
[snip] [handlers] keys=console
[snip] [logger_root] level=CRITICAL handlers=console
[logger_l01] level=DEBUG qualname=l01 handlers=console
[logger_l02] level=CRITICAL qualname=l02 handlers=console
[snip]
With the config above, I expect that zzz gets printed, and qqq doesn't. When I run the script, zzz is printed twice, and qqq isn't. I want that zzz is printed once. How do I do that? I can add a filter if this can't be done otherwise, however, I'm at the moment reluctant to do that since I don't see why CRITICAL for root passes zzz through and drops qqq correctly for l02.
Did you try removing the handler from l01, as I suggested in an earlier
reply? The config above still has the console handler attached to root,
l01 and l02. The reason that zzz is printed twice is that when a logger
decides to process an event, it is passed to handlers attached to
ancestor loggers (unless propagate is set to 0 - but this is not the
normal situation). So, log1 is deciding to process the event (based on
the level), and passing it to its own handlers (l01->console) and then
to its ancestor loggers' handlers (root->console). Remove the handlers
from l01 and l02 and try again.
Hello Vinay,
On Tue, May 30, 2006 at 09:13:25AM -0700, Vinay Sajip wrote: [snip] [handlers] keys=console [snip] [logger_root] level=CRITICAL handlers=console
[logger_l01] level=DEBUG qualname=l01 handlers=console
[logger_l02] level=CRITICAL qualname=l02 handlers=console [snip]
.... When I run the script, zzz is printed twice, and qqq isn't. I want that zzz is printed once.
.... Did you try removing the handler from l01, as I suggested in an earlier reply?
I had removed the whole line, and it complained about the missing
handlers line. Now I've tried with 'handlers=', this seems to work.
Thanks much!
The reason that zzz is printed twice is that when a logger decides to process an event, it is passed to handlers attached to ancestor loggers (unless propagate is set to 0 - but this is not the normal situation). So, log1 is deciding to process the event (based on the level), and passing it to its own handlers (l01->console) and then to its ancestor loggers' handlers (root->console).
Hmm, log1 decides once whether to print an event, and after that it gets
printed in log1 and all its ancestors, regardless of their level? I find
this quite counter-intuitive. I'd instead expect that each logger
decides whether to print an event according to its own level. Could you
give an example why one would want the python behavior?
With kind regards,
Baurzhan. ib*@radix50.net wrote: Hello Vinay,
Hmm, log1 decides once whether to print an event, and after that it gets printed in log1 and all its ancestors, regardless of their level? I find this quite counter-intuitive. I'd instead expect that each logger decides whether to print an event according to its own level. Could you give an example why one would want the python behavior?
Loggers are hierarchical for a reason - not just randomly named
channels. Just as it is generally useful to develop a system by
modularising it into subsystems, packages, modules, etc. so it is
useful when logging to follow a parallel hierarchy. The audiences for
the logging events are orthogonal to the events themselves, and the way
the logging module is organised reflects good practice as determined by
practical experience over a period of time. The approach you're
questioning is not specific to Python - log4j (which inspired Python's
logging), and the logging built into Java 1.4, also work this way.
Practically, this makes configuration a lot simpler; if I want to log
everything to console, I just attach a handler to the root logger, and
I never have to worry about attaching to every single logger. (Logger
names are generally not cast in stone - I might break down a module's
logic into smaller pieces and thus introduce new logger names to
describe events in the refactored module. I certainly don't want to
change my logging configuration every time I refactor my code.)
May I suggest you review the log4j documentation to get a better
exposition of the principles which govern the design of such logging
systems.
Hello Vinay,
On Wed, May 31, 2006 at 03:05:13PM -0700, Vinay Sajip wrote: Hmm, log1 decides once whether to print an event, and after that it gets printed in log1 and all its ancestors, regardless of their level? I find this quite counter-intuitive. I'd instead expect that each logger decides whether to print an event according to its own level. Could you give an example why one would want the python behavior?
Loggers are hierarchical for a reason - not just randomly named channels. ...
Thanks for the explanation! Please note that I am not questioning the
usefulness of hierarchical logging -- I think it's a Good Thing. What I
can't understand is the motivation for the single place of decision
whether a message should be printed ("is enabled" in log4j terms) or
not.
Consider the following scenario: root is CRITICAL, l01 is DEBUG, a debug
message is logged on l01. l01 decides that the message should be
printed, and _both_ root and l01 print it. Now, it is good that the
message is propagated to root, but why doesn't root decide for itself
whether to print it or not?
For instance, I log root to syslog and have only critical messages
there. I log l01 to console to debug. I want that my message to l01 is
not printed by root since its level is CRITICAL. This is why I want that
each logger re-evaluates the message level for itself. Could you perhaps
give a useful example why one could want loggers to decide once?
And another thing I couldn't find how to do: I want to have several
debug levels. I can log messages without problems, but numeric values in
the configuration file cause error messages during
logging.config.fileConfig. Can I specify numeric values in the config
file?
With kind regards,
Baurzhan.
Hello Baurzhan, Consider the following scenario: root is CRITICAL, l01 is DEBUG, a debug message is logged on l01. l01 decides that the message should be printed, and _both_ root and l01 print it. Now, it is good that the message is propagated to root, but why doesn't root decide for itself whether to print it or not?
It's not propagated to the root logger (or to ancestor loggers in
general) - just to the handlers associated with ancestor loggers.
For instance, I log root to syslog and have only critical messages there. I log l01 to console to debug. I want that my message to l01 is not printed by root since its level is CRITICAL. This is why I want that each logger re-evaluates the message level for itself. Could you perhaps give a useful example why one could want loggers to decide once?
You can set levels on handlers as well as loggers. So if you add a
syslog handler to the root and set its level to CRITICAL, only CRITICAL
messages are sent to syslog.
And another thing I couldn't find how to do: I want to have several debug levels. I can log messages without problems, but numeric values in the configuration file cause error messages during logging.config.fileConfig. Can I specify numeric values in the config file?
You should use addLevelName to add custom levels. You can do e.g.
logging.MYCUSTOMLEVEL = 25
logging.addLevelName(logging.MYCUSTOMLEVEL, "MYCUSTOMLEVEL")
and then reference MYCUSTOMLEVEL in the config file.
Regards,
Vinay
Hello Vinay,
On Sun, Jun 04, 2006 at 05:23:55AM -0700, Vinay Sajip wrote: It's not propagated to the root logger (or to ancestor loggers in general) - just to the handlers associated with ancestor loggers.
.... You can set levels on handlers as well as loggers. So if you add a syslog handler to the root and set its level to CRITICAL, only CRITICAL messages are sent to syslog.
.... logging.MYCUSTOMLEVEL = 25 logging.addLevelName(logging.MYCUSTOMLEVEL, "MYCUSTOMLEVEL")
Thanks much!
With kind regards,
Baurzhan. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: jjesso |
last post by:
I am trying to add a new logging level.
logging.config.fileConfig("bengineLog.cfg")
logging.CLIENT = logging.INFO + 1
logging.addLevelName( logging.CLIENT, 'CLIENT' )
logging.root.setLevel( )...
|
by: Karuppasamy |
last post by:
H
I am trying to use the Logging Module provided by Microsoft Application Blocks for .Net
I installed everything as per the Instructions given in the 'Development Using the Logging Block'
...
|
by: pmatos |
last post by:
Hi all,
I am trying to create a simple but efficient C++ logging class. I know
there are lots of them out there but I want something simple and
efficient. The number one requirement is the...
|
by: Rotem |
last post by:
Hi,
while working on something in my current project I have made several
improvements to the logging package in Python, two of them are worth
mentioning:
1. addition of a logging record field...
|
by: Burkhard Schultheis |
last post by:
As I wrote last week, we have a problem with a DB2 V8 on Linux. Here is
what is in db2diag.log during online backup:
Starting a full database backup.
2004-04-01-02.33.54.760164 ...
|
by: robert |
last post by:
As more and more python packages are starting to use the bloomy
(Java-ish) 'logging' module in a mood of responsibility and as I am not
overly happy with the current "thickener" style of usage, I...
|
by: rajesh.hanchate |
last post by:
Please help me in resolving this issue.
I am using EnterpriseLibrary 2.0 Exception and logging block for
logging exceptions to event log. It works fine for sometime. After some
time it stops...
|
by: Chris Shenton |
last post by:
I am setting up handlers to log DEBUG and above to a rotating file and
ERROR and above to console. But if any of my code calls a logger
(e.g., logging.error("foo")) before I setup my handlers, the...
|
by: Lowell Alleman |
last post by:
Here is the situation: I wrote my own log handler class (derived from
logging.Handler) and I want to be able to use it from a logging config
file, that is, a config file loaded with the...
|
by: samwyse |
last post by:
In the Python 2.5 Library Reference, section 14.5.3 (Logging to
multiple destinations), an example is given of logging to both a file
and the console. This is done by using logging.basicConfig()...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: aa123db |
last post by:
Variable and constants
Use var or let for variables and const fror constants.
Var foo ='bar';
Let foo ='bar';const baz ='bar';
Functions
function $name$ ($parameters$) {
}
...
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
| |