我如何格式化日志使其以列的形式打印?

3 投票
1 回答
2093 浏览
提问于 2025-04-18 04:35

我有一个项目,里面有不同的线程和函数,它们都在控制台上用不同的日志级别记录信息,这些级别中有一些是自定义的。

我的日志格式设置成这样:

streamformatter = logging.Formatter(fmt='%(levelname)s:\t%(threadName)s:\t%(funcName)s:\t\t%(message)s', datefmt='%H:%M:%S')

这样一来,我的日志默认看起来就很乱,既不好看,也不容易看出哪个函数在什么时候被调用,以及是哪个线程在调用。

INFO:   COM14-fwcif-listener :  _receive_v32:       my_success: Sending 24 lines to formatter
DB_TRACE:   COM14-fwcif-listener :  _format_and_log_v32:        {"prompt": "undef-COM14", "x_type": "tracelogentry", "y_time": 1392695506.044583, "z_msg": "...."}
INFO:   COM13-fwutil-listener:  _receive_v32:       my_success: Sending 10 lines to formatter
DB_TRACE:   COM13-fwutil-listener:  _format_and_log_v32:        {"prompt": "undef-COM13", "x_type": "tracelogentry", "y_time": 1392695507.356714, "z_msg": "...."}
INFO:   MainThread: _parse:     my_resolve after 4.9784979820251465 seconds and 29 vs 8 attempts
MY_INFO:    MainThread: _parse:     my_success for cmd "trig" =>> "not ready". COM12.ISREADY now set to True
INFO:   MainThread: send:       my_success. Lock being released: <_thread.RLock owner=7512 count=1> with cmd "format c:" and state COM12.ISREADY = False
INFO:   COM12-fwmain-listener:  _receive_v32:       my_success: Number of lines split by S65 is 2 of 16 total lines
INFO:   COM12-fwmain-listener:  _format_and_log_v32:        my_resolve "S65>" added as COM12.lastlinefragment
INFO:   COM12-fwmain-listener:  _format_and_log_v32:        my_success: 575 chars written to log.   Prompt and type detected is "S65>" and "replylogentry: format"
DB_REPLY:   COM12-fwmain-listener:  _format_and_log_v32:        {"prompt": "S65>", "x_type": "replylogentry: format", "y_time": 1392695510.41302, "z_msg": "..."}
INFO:   MainThread: _parse:     my_resolve  searching for "format"=>"Unknown command" in string "..."

1 个回答

5

每个标记的宽度可以在 streamformatter 中这样设置,以便生成固定列宽的日志输出:

streamformatter = logging.Formatter(fmt='%(levelname)-10s:  %(threadName)-20s: %(funcName)-20s:  %(message)s', datefmt='%H:%M:%S')

撰写回答