Python define logger in one location without using basic config or file config
The question of how to define a logger in one location was asked here:
Using Python logging in multiple modules
However the two top answers use basic config or a file config. I don't want to use a file config because I want to be able to dynamically adjust the level with command line arguments. I don't want to use a basic config because, well, my config won't be basic.
This is not library code so I'm not concerned with whatever might happen if the module is imported. My code also has a single entry point.
This is (a simplified) version of what I have at the moment:
temp1.py :
import logging
import sys
import temp2
formatter = logging.Formatter(
fmt = '%(asctime)s - %(module)s - %(levelname)s ===> %(message)s'
)
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("THIS IS AN INFO MESSAGE IN TEMP 1")
temp2.do_something()
temp2.py:
import logging
logger = logging.getLogger(__name__)
logger.info('In temp 2')
def do_something():
logger.critical('doing someting in temp 2')
This is the output:
2018-11-23 18:31:40,543 - temp1 - INFO ===> THIS IS AN INFO MESSAGE IN TEMP 1
doing something in temp 2
The output I desire would:
1) Format the output in the file temp2.py as well and
2) Also log the module_level logging message in temp2.py
I've been through the docs but I can't figure this one out. What do I need to do?
python logging module
|
show 1 more comment
The question of how to define a logger in one location was asked here:
Using Python logging in multiple modules
However the two top answers use basic config or a file config. I don't want to use a file config because I want to be able to dynamically adjust the level with command line arguments. I don't want to use a basic config because, well, my config won't be basic.
This is not library code so I'm not concerned with whatever might happen if the module is imported. My code also has a single entry point.
This is (a simplified) version of what I have at the moment:
temp1.py :
import logging
import sys
import temp2
formatter = logging.Formatter(
fmt = '%(asctime)s - %(module)s - %(levelname)s ===> %(message)s'
)
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("THIS IS AN INFO MESSAGE IN TEMP 1")
temp2.do_something()
temp2.py:
import logging
logger = logging.getLogger(__name__)
logger.info('In temp 2')
def do_something():
logger.critical('doing someting in temp 2')
This is the output:
2018-11-23 18:31:40,543 - temp1 - INFO ===> THIS IS AN INFO MESSAGE IN TEMP 1
doing something in temp 2
The output I desire would:
1) Format the output in the file temp2.py as well and
2) Also log the module_level logging message in temp2.py
I've been through the docs but I can't figure this one out. What do I need to do?
python logging module
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
1
Do you have control over the other modules? One method I've used is passing thelogger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.
– Idlehands
Nov 23 '18 at 16:56
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
1
Another way is you can separate the logger itself entirely as a separate module, and then in each of your modulefrom my_logger import logger
. You might eventry: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger
– Idlehands
Nov 23 '18 at 17:00
|
show 1 more comment
The question of how to define a logger in one location was asked here:
Using Python logging in multiple modules
However the two top answers use basic config or a file config. I don't want to use a file config because I want to be able to dynamically adjust the level with command line arguments. I don't want to use a basic config because, well, my config won't be basic.
This is not library code so I'm not concerned with whatever might happen if the module is imported. My code also has a single entry point.
This is (a simplified) version of what I have at the moment:
temp1.py :
import logging
import sys
import temp2
formatter = logging.Formatter(
fmt = '%(asctime)s - %(module)s - %(levelname)s ===> %(message)s'
)
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("THIS IS AN INFO MESSAGE IN TEMP 1")
temp2.do_something()
temp2.py:
import logging
logger = logging.getLogger(__name__)
logger.info('In temp 2')
def do_something():
logger.critical('doing someting in temp 2')
This is the output:
2018-11-23 18:31:40,543 - temp1 - INFO ===> THIS IS AN INFO MESSAGE IN TEMP 1
doing something in temp 2
The output I desire would:
1) Format the output in the file temp2.py as well and
2) Also log the module_level logging message in temp2.py
I've been through the docs but I can't figure this one out. What do I need to do?
python logging module
The question of how to define a logger in one location was asked here:
Using Python logging in multiple modules
However the two top answers use basic config or a file config. I don't want to use a file config because I want to be able to dynamically adjust the level with command line arguments. I don't want to use a basic config because, well, my config won't be basic.
This is not library code so I'm not concerned with whatever might happen if the module is imported. My code also has a single entry point.
This is (a simplified) version of what I have at the moment:
temp1.py :
import logging
import sys
import temp2
formatter = logging.Formatter(
fmt = '%(asctime)s - %(module)s - %(levelname)s ===> %(message)s'
)
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("THIS IS AN INFO MESSAGE IN TEMP 1")
temp2.do_something()
temp2.py:
import logging
logger = logging.getLogger(__name__)
logger.info('In temp 2')
def do_something():
logger.critical('doing someting in temp 2')
This is the output:
2018-11-23 18:31:40,543 - temp1 - INFO ===> THIS IS AN INFO MESSAGE IN TEMP 1
doing something in temp 2
The output I desire would:
1) Format the output in the file temp2.py as well and
2) Also log the module_level logging message in temp2.py
I've been through the docs but I can't figure this one out. What do I need to do?
python logging module
python logging module
asked Nov 23 '18 at 16:34
NeilNeil
507110
507110
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
1
Do you have control over the other modules? One method I've used is passing thelogger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.
– Idlehands
Nov 23 '18 at 16:56
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
1
Another way is you can separate the logger itself entirely as a separate module, and then in each of your modulefrom my_logger import logger
. You might eventry: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger
– Idlehands
Nov 23 '18 at 17:00
|
show 1 more comment
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
1
Do you have control over the other modules? One method I've used is passing thelogger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.
– Idlehands
Nov 23 '18 at 16:56
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
1
Another way is you can separate the logger itself entirely as a separate module, and then in each of your modulefrom my_logger import logger
. You might eventry: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger
– Idlehands
Nov 23 '18 at 17:00
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
1
1
Do you have control over the other modules? One method I've used is passing the
logger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.– Idlehands
Nov 23 '18 at 16:56
Do you have control over the other modules? One method I've used is passing the
logger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.– Idlehands
Nov 23 '18 at 16:56
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
1
1
Another way is you can separate the logger itself entirely as a separate module, and then in each of your module
from my_logger import logger
. You might even try: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger– Idlehands
Nov 23 '18 at 17:00
Another way is you can separate the logger itself entirely as a separate module, and then in each of your module
from my_logger import logger
. You might even try: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger– Idlehands
Nov 23 '18 at 17:00
|
show 1 more comment
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450220%2fpython-define-logger-in-one-location-without-using-basic-config-or-file-config%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450220%2fpython-define-logger-in-one-location-without-using-basic-config-or-file-config%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Couldn't the file config be set to some default level that you then override with your command line parameters, i.e. read the file config then read command line parameters, overriding as necessary?
– Jonah Bishop
Nov 23 '18 at 16:41
Maybe, but I then don't see how that override would propagate through to the other files. So I'd still be in the same position.
– Neil
Nov 23 '18 at 16:43
1
Do you have control over the other modules? One method I've used is passing the
logger
itself into the other modules as arguments. I concede it doesn't feel very pythonic but it does work.– Idlehands
Nov 23 '18 at 16:56
I could do that I suppose.
– Neil
Nov 23 '18 at 16:57
1
Another way is you can separate the logger itself entirely as a separate module, and then in each of your module
from my_logger import logger
. You might eventry: logger.debug(f'In {__name__}'); except NameError: from my_logger import logger;
to check if a logger already exists, if not, load in your custom logger– Idlehands
Nov 23 '18 at 17:00