python里的formatter,如何正确对齐Python日志中的级别字段.Formatter

I'm currently trying to right align the logging level field in my Python logger so that output such as:

[2011-10-14 13:47:51] [DEBUG] --- starting... (smtphandlers.py:96)

[2011-10-14 13:47:51] [INFO] --- first things first... (smtphandlers.py:97)

[2011-10-14 13:47:51] [WARNING] --- about to end... (smtphandlers.py:98)

[2011-10-14 13:47:51] [DEBUG] --- ending (smtphandlers.py:99)

instead looks like:

[2011-10-14 13:47:51] [ DEBUG] --- starting... (smtphandlers.py:96)

[2011-10-14 13:47:51] [ INFO] --- first things first... (smtphandlers.py:97)

[2011-10-14 13:47:51] [ WARNING] --- about to end... (smtphandlers.py:98)

[2011-10-14 13:47:51] [ DEBUG] --- ending (smtphandlers.py:99)

The format line for the first block is:

logging.Formatter("[%(asctime)s] [%(levelname)s] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")

If I know the max level length is 8 (eg: CRITICAL), then I'll right align to 8 spaces.

I'm trying to figure out how to achieve this. The following fails because "%(levelname)s" is more than 8 characters (the substitution doesn't happen until later). If I use something like "{0:>20}".format"%(levelname)s", then it works, but that is more padding than I need or want.

logging.Formatter("[%(asctime)s] [" + "{0:>8}".format"%(levelname)s" + "] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")

Short of subclassing Formatter, anyone have a way to achieve this?

解决方案

Like this:

logging.Formatter("[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(lineno)s)", "%Y-%m-%d %H:%M:%S")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。你的意思是你在进行 logging 的二次封装时,发现在 Formatter 设置的 `filename` 参数输出的文件名不正确,对吗? 如果是这样,可能是因为在 Formatter 设置的 `filename` 参数也是默认使用 `__file__` 获得的当前模块的文件名,而不是你想要的被日志记录的文件名。 解决这个问题的方法是,你可以在自定义的 logging 函数,手动添加一个 `filename` 参数,并将其传递给 Formatter,而不是使用默认值。例如: ```python import logging def custom_logger(filename): logger = logging.getLogger(filename) logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', '%Y-%m-%d %H:%M:%S') file_handler = logging.FileHandler(filename + '.log') file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger logger = custom_logger('my_module') logger.debug('This is a debug message') ``` 在上面的代码,我们在自定义的 logging 函数添加了一个 `filename` 参数,并将其传递给 FormatterFormatter 使用了 `% (asctime) s` 来添加记录时间,`%(name)s` 来添加 logger 名称,`%(levelname)s` 来添加日志级别,`%(message)s` 来添加日志消息。`%Y-%m-%d %H:%M:%S` 用于设置记录时间的格式。 这样,你就可以在调用 logging 函数时,指定要记录日志的文件名了。 希望这能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值