msg92932 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-09-21 11:23 |
I want the Python executable to have command line flags which allow
simple configuration of the logging module. Use cases are to run
applications/scripts (which use libraries that use logging calls) with
different logging output without having to edit (ugly) logging config files.
The attached patch demonstrates the idea; it allows to run 'python -l
<options> ...' and passes <options> to a new function
logging._parse_python_options(<options>).
|
msg92945 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-09-21 16:59 |
I get the idea. The Python part of the patch demonstrates what you're
getting at, though it can't be used as is - for example the
getattr(logging, a, a) could lead to problems. However a more
intelligent parser (which looked for specific keywords recognised by
basicConfig(), and got the correct values accordingly) wouldn't be much
more complicated. (I'll look at enhancing this part.)
As for the changes to main.c - I am a C/C++ developer but have not made
any changes to Python C code so far - it would be good if a more
experienced committer reviews this part (not sure who - can someone
please reassign/add to nosy list)? Thanks.
|
msg92946 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-09-21 17:15 |
> I get the idea. The Python part of the patch demonstrates what you're
> getting at, though it can't be used as is - for example the
> getattr(logging, a, a) could lead to problems. However a more
> intelligent parser (which looked for specific keywords recognised by
> basicConfig(), and got the correct values accordingly) wouldn't be much
> more complicated. (I'll look at enhancing this part.)
>
> As for the changes to main.c - I am a C/C++ developer but have not made
> any changes to Python C code so far - it would be good if a more
> experienced committer reviews this part (not sure who - can someone
> please reassign/add to nosy list)? Thanks.
Both parts of the patch are only thought to demonstrate the idea.
You said you'll attack the Python part - good.
For the C part, the most prominemt things that are missing are these:
- free(logopt) should be called at the end of the 'if (logopts != NULL) {' block.
- error handling should be improved. Errors in this block should probably exit Python.
|
msg92947 - (view) |
Author: Antoine Pitrou (pitrou) * |
Date: 2009-09-21 17:34 |
If you want to add flags to the main executable, it deserves a
discussion on python-dev IMO.
It could be obtained through an environment variable, e.g.
PYLOGGING_CONFIG; which has the nice side-effect of working for
executable scripts too.
|
msg92949 - (view) |
Author: Eric V. Smith (eric.smith) * |
Date: 2009-09-21 18:23 |
The C code looks basically okay to me. I'd probably use strdup() instead
of the malloc/strlen/strcpy calls. And as Thomas said, the cleanup needs
a little bit of work.
|
msg92950 - (view) |
Author: R. David Murray (r.david.murray) * |
Date: 2009-09-21 18:31 |
Also possibly relevant was the recent python-dev discussion about
replicating (some of) the command line argument parsing in python so
that it can be used by things other than the 'python' command:
http://mail.python.org/pipermail/python-dev/2009-August/091484.html
|
msg92952 - (view) |
Author: Georg Brandl (georg.brandl) * |
Date: 2009-09-21 18:44 |
Also, don't forget to update the "python -h" help text.
|
msg92953 - (view) |
Author: Michael Foord (michael.foord) * |
Date: 2009-09-21 18:47 |
Why does this need to be built into the interpreter? The script / app
should have logging config support.
|
msg92956 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-09-21 20:16 |
> Why does this need to be built into the interpreter? The script / app
> should have logging config support.
It does not need to, but it would be nice.
I think the '-l' flag should be similar to the -W flag.
Or consider for example using unittest.main() as script/app.
|
msg92957 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-09-21 20:32 |
If we do include interpreter support, there should be an option to
invoke a configuration file, too:
-l config=path
Mutually exclusive with all the other options. So, you can either use it
to invoke basicConfig or to invoke an arbitrary configuration in a file.
Opinions?
|
msg92958 - (view) |
Author: Doug Hellmann (doughellmann) * |
Date: 2009-09-21 20:45 |
I think I'm with Michael on this one. I'd rather add logging
configuration to any stdlib modules that support being run directly and
want to support logging.
|
msg92959 - (view) |
Author: R. David Murray (r.david.murray) * |
Date: 2009-09-21 20:58 |
I don't think this is about logging in stdlib modules that are run
directly. I think this is about a library that contains logging calls
(eg: multiprocessing), and is used in j-random-application, and while
prototyping/debugging the application you want to access that logging
information without having to write a logging infrastructure into your
app first. Or you want to access it while debugging someone _else_'s
application...
|
msg92960 - (view) |
Author: Jean-Paul Calderone (exarkun) * |
Date: 2009-09-21 21:02 |
How about putting this into the logging module instead? Instead of
"python <logging options> <program> <program options>", making it
"python -m logging <logging options> <program> <program options".
This:
* involves no changes to the core interpreter
* only requires Python to be written, not C
* Lets other VMs benefit from the feature immediately
* Follows what seems to be the emerging convention for this kind of
(eg pdb, unittest)
* Still allows logging to be configured for arbitrary programs that
wouldn't otherwise be configurable in this way
|
msg92961 - (view) |
Author: Doug Hellmann (doughellmann) * |
Date: 2009-09-21 21:19 |
How do these "global" settings (either via the interpreter or a wrapper
in the logging module) change what an app might do on its own? IOW, if
my app is already written to configure logging, and someone invokes it
with these other settings, which settings are used?
|
msg92994 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-09-22 13:50 |
Both Doug and Jean-Paul have made good points, IMO.
|
msg93007 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-09-22 19:01 |
> Jean-Paul Calderone:
>
> How about putting this into the logging module instead? Instead of
> "python <logging options> <program> <program options>", making it
> "python -m logging <logging options> <program> <program options".
>
> This:
>
> * involves no changes to the core interpreter
> * only requires Python to be written, not C
> * Lets other VMs benefit from the feature immediately
> * Follows what seems to be the emerging convention for this kind of
> (eg pdb, unittest)
> * Still allows logging to be configured for arbitrary programs that
> wouldn't otherwise be configurable in this way
This is a very good idea, and fully covers my use case.
|
msg93008 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-09-22 19:03 |
> How do these "global" settings (either via the interpreter or a wrapper
> in the logging module) change what an app might do on its own? IOW, if
> my app is already written to configure logging, and someone invokes it
> with these other settings, which settings are used?
IMO the same would happen as if logging.basicConfig() would have been called
followed by calls to the custom configuration.
|
msg93010 - (view) |
Author: Doug Hellmann (doughellmann) * |
Date: 2009-09-22 19:30 |
@theller, I'm not sure what your point is. I'm asking what the defined
behavior is if we provide some sort of global way to run a program with
logging configured, and then that app turns around and tries to
reconfigure it. Should the last one to call the configuration
function(s) win, or the first?
I like the idea of adding this feature to the logging module better than
building it into the interpreter, but I still think it opens up areas
for unexpected behavior, and it would be better to just let each
application set up its own logging.
|
msg93012 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-09-22 19:45 |
@theller: Although your use case just covers using basicConfig, I can
just see users expecting the same mechanism to invoke configuration
stored in a logging configuration file, which is why I suggested the
config= variant. However, doughellmann raises the valid point of what
the semantics would be if the program you invoke via logging -m does its
own configuration.
With a simple implementation: If a script calls basicConfig after it has
been invoked with logging -m etc. then the basicConfig call won't do
anything, as if the root logger already has some handlers, the call is
essentially a no-op. If the called script loads a configuration file,
that will overwrite the configuration specified via logging -m.
Either way, it's not consistent IMO - sometimes the logging -m
configuration will seem to win, and other times, the called script's
configuration.
Of course, it could be argued that logging -m is intended for scripts
which don't do explicit configuration - I'm not sure of how strong an
argument this is.
Thinking caps on :-)
|
msg93013 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-09-22 19:46 |
Ummm, s/logging -m/-m logging/
|
msg93418 - (view) |
Author: Thomas Heller (theller) * |
Date: 2009-10-01 18:35 |
I retract this request. It seems the idea is not liked or a solution is
not easy.
(The solution I now use is to start Python from a batch file that parses
some command line flags itself, sets environment variables, and my
sitecustomize.py file configures logging).
Thanks for the comments.
|
msg93425 - (view) |
Author: Vinay Sajip (vinay.sajip) * |
Date: 2009-10-01 22:46 |
Ok. I think it's a reasonable request, but I can see that implementing
it naively without some further thought will lead to (justifiable)
complaints from some users that the behaviour is contradictory or
unintuitive in terms of which configuration "wins" in the event of
ambiguity.
|
msg127952 - (view) |
Author: Éric Araujo (eric.araujo) * |
Date: 2011-02-04 23:34 |
I think Antoine’s envvar idea was a good one, similar to PYTHONWARNINGS.
|
msg261217 - (view) |
Author: Marc Abramowitz (Marc.Abramowitz) * |
Date: 2016-03-05 17:55 |
I was just thinking that it would be nice if logging could be configured through environment variables. This would make it easier to have Python applications adhere to the Twelve-Factor methodology around application configuration:
http://12factor.net/config
Currently, applications need to handle this themselves, but I wonder if there's value in deciding on a best practice and providing for it at a lower level (the stdlib logging module).
|
msg261219 - (view) |
Author: Marc Abramowitz (Marc.Abramowitz) * |
Date: 2016-03-05 18:08 |
I guess I should be more specific about the 12factor thing I just mentioned, because http://12factor.net/logs says:
>>>
A twelve-factor app never concerns itself with routing or storage of its output stream. It should not attempt to write to or manage logfiles. Instead, each running process writes its event stream, unbuffered, to stdout. During local development, the developer will view this stream in the foreground of their terminal to observe the app’s behavior.
>>>
The part that I want to be configurable is what the log levels are for various loggers.
For example, in production, you probably want most or all of your loggers set to WARN or such.
When running in development, ideally the developer can turn on more verbose logging without having to edit config files.
e.g.:
This is a Pyramid application, but environment variables of course could be used with any kind of application -- Django, etc.
```
LOGGER_ANWEB_LEVEL=debug pserve app.ini
```
|
|
Date |
User |
Action |
Args |
2022-04-11 14:56:53 | admin | set | github: 51207 |
2016-03-05 18:08:45 | Marc.Abramowitz | set | messages:
+ msg261219 |
2016-03-05 17:55:24 | Marc.Abramowitz | set | nosy:
+ Marc.Abramowitz messages:
+ msg261217
|
2011-02-04 23:34:10 | eric.araujo | set | nosy:
+ eric.araujo messages:
+ msg127952
|
2009-10-01 22:46:17 | vinay.sajip | set | messages:
+ msg93425 |
2009-10-01 18:35:02 | theller | set | status: open -> closed resolution: not a bug messages:
+ msg93418
|
2009-09-22 19:46:44 | vinay.sajip | set | messages:
+ msg93013 |
2009-09-22 19:45:38 | vinay.sajip | set | messages:
+ msg93012 |
2009-09-22 19:30:31 | doughellmann | set | messages:
+ msg93010 |
2009-09-22 19:03:36 | theller | set | messages:
+ msg93008 |
2009-09-22 19:01:54 | theller | set | messages:
+ msg93007 |
2009-09-22 13:50:59 | vinay.sajip | set | messages:
+ msg92994 |
2009-09-21 21:19:00 | doughellmann | set | messages:
+ msg92961 |
2009-09-21 21:02:35 | exarkun | set | nosy:
+ exarkun messages:
+ msg92960
|
2009-09-21 20:58:34 | r.david.murray | set | messages:
+ msg92959 |
2009-09-21 20:45:52 | doughellmann | set | messages:
+ msg92958 |
2009-09-21 20:32:12 | vinay.sajip | set | messages:
+ msg92957 |
2009-09-21 20:16:46 | theller | set | messages:
+ msg92956 |
2009-09-21 18:47:37 | michael.foord | set | nosy:
+ michael.foord messages:
+ msg92953
|
2009-09-21 18:44:21 | georg.brandl | set | nosy:
+ georg.brandl messages:
+ msg92952
|
2009-09-21 18:31:00 | r.david.murray | set | nosy:
+ r.david.murray, ncoghlan messages:
+ msg92950
|
2009-09-21 18:23:01 | eric.smith | set | messages:
+ msg92949 |
2009-09-21 17:34:02 | pitrou | set | nosy:
+ pitrou messages:
+ msg92947
|
2009-09-21 17:15:56 | theller | set | messages:
+ msg92946 |
2009-09-21 16:59:43 | vinay.sajip | set | messages:
+ msg92945 |
2009-09-21 12:21:57 | doughellmann | set | nosy:
+ doughellmann
|
2009-09-21 12:15:38 | r.david.murray | set | priority: normal nosy:
+ vinay.sajip
versions:
+ Python 2.7, Python 3.2 |
2009-09-21 12:07:32 | eric.smith | set | nosy:
+ eric.smith
|
2009-09-21 11:23:16 | theller | create | |