python log文件处理_Python日志记录 – 仅用于文件处理程序的exc_info

我为它定义了根记录器和处理程序:

_root = logging.getLogger()

_sh = logging.StreamHandler()

_fh = logging.FileHandler('./error.log', delay = True)

_root.addHandler(_sh)

_root.addHandler(_fh)

和模块记录器实例:

_log = logging.getLogger("Main")

# In other file

_log = logging.getLogger("Configuration")

现在我在try..except块中调用_log.exception:

_log.exception("Test")

现在我在控制台和文件中得到追溯.我尝试使用控制台处理程序禁止打印exc_info,但不使用文件处理程序:

class _TraceBackFilter(logging.Filter):

def filter(self, rec):

rec.exc_info = None

return True

_sh = logging.StreamHandler()

_sh.addFilter(_TraceBackFilter())

_root.addHandler(_sh)

这适用于文件和控制台处理程序,所有处理程序都完全删除了回溯,但我只需要控制台.有没有办法只为控制台处理程序压缩exc_info,而不是文件处理程序?

编辑:

我修改了_TraceBackFilter类.

class _TraceBackFilter(logging.Filter):

def filter(self, rec):

if rec.exc_info:

logging.getLogger(rec.name).log(rec.levelno, rec.getMessage())

return False

else:

return True

现在它适用于控制台处理程序,但在文件中我有两个消息,一个有一个没有回溯.

解决方法:

为您的控制台处理程序创建一个logging.Formatter子类,该子类从其formatException方法返回一个空字符串.

异常文本缓存在记录中(在属性exc_text中):如果这是一个假值(例如空字符串),那么将调用formatException()来重新填充它,否则它将不会.因此,在格式化程序类中,您可能需要覆盖format()方法并在调用超类’format()方法之前将record.exc_text设置为false值,以确保调用formatException()被覆盖.例如(未测试):

class NoExceptionFormatter(logging.Formatter):

def format(self, record):

record.exc_text = '' # ensure formatException gets called

return super(NoExceptionFormatter, self).format(record)

def formatException(self, record):

return ''

标签:python,logging

来源: https://codeday.me/bug/20190626/1295790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值