0

I have a question on how to configure my python logger. Below you can see my current set up of the logger. (http://docs.python.org/2/howto/logging-cookbook.html)

logger = logging.getLogger("someName")
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("./log/log.out", "w")
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stderr)
ch.setLevel(logging.ERROR)

frm = logging.Formatter('%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s','H:%M:%S')
fh.setFormatter(frm)
ch.setFormatter(frm)
logger.addHandler(fh)
logger.addHandler(ch)

Is there a way to configure the logger in such a way that it also writes error messages like the one below:

print a
>>> NameError: global name 'a' is not defined

Thanks a lot for your help.

1 Answer 1

5

Wrap your code in a try:, except Exception: block and call logger.exception():

try:
    print a
except Exception:
    logger.exception('Oops, something went wrong')

You could add a raise statement to that to re-raise the caught exception.

Demo:

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger()
>>> def foo():
...     print a
... 
>>> def bar(i=0):
...     if i < 3:
...         bar(i + 1)
...     else:
...         foo()
... 
>>> def baz():
...     try:
...         bar()
...     except Exception:
...        logger.exception('Oops, something went wrong')
... 
>>> def spam(): baz()
... 
>>> spam()
ERROR:root:Oops, something went wrong
Traceback (most recent call last):
  File "<stdin>", line 3, in baz
  File "<stdin>", line 3, in bar
  File "<stdin>", line 3, in bar
  File "<stdin>", line 3, in bar
  File "<stdin>", line 5, in bar
  File "<stdin>", line 2, in foo
NameError: global name 'a' is not defined

The traceback was logged by the logging module, not by my interactive Python session.

The traceback leads from the try block to the exception; the spam() function is the above example is not included.

Sign up to request clarification or add additional context in comments.

9 Comments

I think this is not what I want, since I dont get a hint were the bug really is. In my orignial code the error message in the console is to long, to see it entirely, so I think this is not what I am looking for.
@swot: The full traceback is logged to your logfile. My sample exception is rather short, what makes you think this is a truncated traceback?
Actually, if I have def somefunction(): print a I didnt get the full traceback in my log file. Any suggestions?
@swot: Where did you catch the exception? At the entry point of your program or inside somefunction()?
create logger </br> somefuntion() </br> try:somefunction </br> except Exception: </br> logger.exception("oops) This is the way I set it up. Does this help?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.