By Brian Fitzgerald
Here are a few notes on cleaner-looking python logging messages. Some package defaults lead to verbose, ragged looking output.
from threading import Thread
from logging import debug, info, warning, error, critical
from logging import DEBUG, basicConfig
def hello():
warning('Something is up')
basicConfig(level=DEBUG,
format='%(asctime)s %(levelname)s %(threadName)s %(message)s'
)
debug('begin')
error('problem')
critical('danger')
threads = []
for i in [1, 2]:
th = Thread(target=hello)
th.start()
threads.append(th)
for th in threads:
th.join()
info('joined')
info('done')
"C:\Users\Brian Fitzgerald\PycharmProjects\blog\venv\Scripts\python.exe" "C:/Users/Brian Fitzgerald/PycharmProjects/blog/threadlogging.py" 2018-05-03 21:12:51,098 DEBUG MainThread begin 2018-05-03 21:12:51,099 ERROR MainThread problem 2018-05-03 21:12:51,099 CRITICAL MainThread danger 2018-05-03 21:12:51,099 WARNING Thread-1 Something is up 2018-05-03 21:12:51,100 WARNING Thread-2 Something is up 2018-05-03 21:12:51,100 INFO MainThread joined 2018-05-03 21:12:51,100 INFO MainThread joined 2018-05-03 21:12:51,100 INFO MainThread done Process finished with exit code 0
Notes:
- The timestamp field is 23 characters
- The level field is 4 to 8 characters
- The thread identifier in this example is up to 10 characters
- The logger prefix requires up to 43 characters
- The content has a ragged appearance
Next, we will make three changes
- use datefmt for a shorter date string: %Y%m%d.%H%M%S
- use single character abbreviations for level: D, I, W, E, and C
- format short, fixed-width thread identifiers using th%02d
from threading import Thread, currentThread
from logging import debug, info, warning, error, critical
from logging import DEBUG, basicConfig, addLevelName
def hello():
warning('Something is up')
basicConfig(
level=DEBUG,
datefmt='%Y%m%d.%H%M%S',
format='%(asctime)s %(levelname)s %(threadName)s %(message)s')
currentThread().setName('main')
addLevelName(10, 'D')
addLevelName(20, 'I')
addLevelName(30, 'W')
addLevelName(40, 'E')
addLevelName(50, 'C')
debug('begin')
error('problem')
critical('danger')
threads = []
for i in [1, 2]:
th = Thread(target=hello)
th.setName('th%02d' % i)
th.start()
threads.append(th)
for th in threads:
th.join()
info('joined')
info('done')
"C:\Users\Brian Fitzgerald\PycharmProjects\blog\venv\Scripts\python.exe" "C:/Users/Brian Fitzgerald/PycharmProjects/blog/threadlogging.py" 20180503.211759 D main begin 20180503.211759 E main problem 20180503.211759 C main danger 20180503.211759 W th01 Something is up 20180503.211759 W th02 Something is up 20180503.211759 I main joined 20180503.211759 I main joined 20180503.211759 I main done Process finished with exit code 0
Now, each log file entry has a fixed 22-character width. There is more space to the right for the actual content.