Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does logging a custom error in python appear as root?

EDIT: The reason that the :root: was appearing was because I typed logging.error(...) instead of logger.error. This caused the program to default to handler root. This changed the general formatting which includes the handler name. Correcting to logger and just adding the error name to the message seems to create the correct output.

OLD TEXT

With the logging package I am trying log a custom error. When doing so the error message shows up, but the custom error exception appears to show up as root. For example a simple case is shown below running on python 3.6.6

Input looks like:

 import logging
 import logging.config

 logger = logging.getLogger(__name__)
 logger.setLevel(logging.INFO)
 HANDLER = logging.FileHandler('test.txt')
 logger.addHandler(HANDLER)
 FORMATTER = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
 HANDLER.setFormatter(FORMATTER)

 class FailedToDoSimpleTaskError(Exception):
     pass

 def fail_todo_thing():
     raise FailedToDoSimpleTaskError('It was a good attempt though')

 try:
     fail_todo_thing()
 except FailedToDoSimpleTaskError as err:
     logging.error(err)

Output looks like:

__main__-ERROR:root:It was a good attempt though

What I am trying to understand is why it shows up with :root:, and if there is any way to have it show up instead with :FailedToDoSimpleTaskError: ?

like image 486
akozi Avatar asked Dec 14 '25 18:12

akozi


1 Answers

As you stated in your edit, if you correct logging.error(err) with logger.error(err) you get the correct output __main__ - ERROR - It was a good attempt though.

The reason for root appearing in your message is explained under logging documentation. In that documentation you can find out about changing the format of displayed messages.

Since you did use logging.error(err) you were not invoking logger which had specified the format you wanted. Hence the root word appeared.

You should have also noticed that when using logging.error(err) you would get the message on the console and not added to your log file. And if you try to use logging.info no message would have been written to the console, as the defaul log level is WARNING and the level you had set as INFO was for the HANDLER named logger. So if you try for example logging.info("Info test") nothing would appear in the log console nor in your log file. However using logger.info("Info test") you would get the message "Info test" written in your log file.

like image 96
Cedric Zoppolo Avatar answered Dec 16 '25 12:12

Cedric Zoppolo