一个简单使用logging的例子

1.logging基本使用

先配置logging,然后使用logging输出不同level的信息(就不用先print输出,调试好了再注释掉)

import logging
logging.basicConfig(level=logging.INFO #设置日志输出格式
                    # ,filename="demo.log" #log日志输出的文件位置和文件名
                    # ,filemode="w" #文件的写入格式,w为重新写入文件,默认是追加
                    ,format="%(asctime)s - %(name)s - %(levelname)-8s - %(filename)-8s : %(lineno)s line - %(message)s" #日志输出的格式, -8表示占位符,让输出左对齐,输出长度都为8位
                    ,datefmt="%Y-%m-%d %H:%M:%S" #时间输出的格式
                    )

class Calc(object):
	"""
	calc x // y
	"""
	def __init__(self, x=0, y=0):
		self._x = x
		self._y = y
		logging.debug("init x=%d, y=%d" % (self._x, self._y))
	
	@property
	def x(self):
		return self._x 
	@x.setter
	def x(self, x):
		self._x = x
		logging.debug("set x=%d", self._x)
	
	@property
	def y(self):
		return self._y
	@y.setter
	def y(self, y):
		logging.warning("notice: y can not be zero")
		self._y = y
		logging.debug("set y=%d", self._y)

	def calc(self):
		if self._x < self._y:
			logging.warning("x is less than y")
		logging.info("calc: x=%d, y=%d", self._x, self._y)
		
		try:
			return self._x // self._y
		except:
			logging.error("y is zero")
			raise ValueError("y can not be zero")
		finally:
			print("over")

c = Calc()
c.x = 10
c.y = 20
# c.y = 0
c.calc()

2.logging自定义使用

logging采用模块化设计,主要包含四个部分:

  • logger:类似于笔,产生日志
  • handler:日志输出到哪里?控制台还是文件?
  • filter:
  • formatter:

依次配置各个部分,具体见注释

import logging

class Calc(object):
	"""
	calc x // y
	"""
	def __init__(self, x=0, y=0):
		self.log()
		self._x = x
		self._y = y
		self.logger.debug("init x=%d, y=%d" % (self._x, self._y))
	
	@property
	def x(self):
		return self._x 
	@x.setter
	def x(self, x):
		self._x = x
		self.logger.debug("set x=%d", self._x)
	
	@property
	def y(self):
		return self._y
	@y.setter
	def y(self, y):
		self.logger.warning("notice: y can not be zero")
		self._y = y
		self.logger.debug("set y=%d", self._y)

	def log(self):
		# 创建logger并设置level(最好是DEBUG),单例模式,相同名字的logger只能创建一个
		self.logger = logging.getLogger("logger")
		self.logger.setLevel(level=logging.DEBUG)

		# 将日志输出到哪里,屏幕和文件,handler的level应该不低于logger
		# 详细日志输出到文件,简略日志输出到屏幕
		self.handler_stream = logging.StreamHandler()
		self.handler_stream.setLevel(level=logging.WARNING)
		self.handler_file = logging.FileHandler('logger.log', mode='w')
		self.handler_file.setLevel(level=logging.DEBUG)

		# 设置输出格式
		self.formatter = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)-8s - %(filename)-8s : line %(lineno)s  - %(message)s",
					datefmt="%Y-%m-%d %H:%M:%S")
		
		# handler设置输出格式,绑定formatter
		self.handler_file.setFormatter(self.formatter)
		self.handler_stream.setFormatter(self.formatter)

		# logger设置输出位置,一个logger可以绑定多个handler
		self.logger.addHandler(self.handler_stream)
		self.logger.addHandler(self.handler_file)

		# 只允许logger1,相当于不输出logger的日志
		self.filter = logging.Filter("logger1")
		self.logger.addFilter(self.filter)
		# self.handler_stream.addFilter(self.filter)

	def calc(self):
		if self._x < self._y:
			self.logger.warning("x is less than y")
		self.logger.info("calc: x=%d, y=%d", self._x, self._y)
		
		try:
			return self._x // self._y
		except:
			self.logger.error("y is zero", exc_info=True)
			raise ValueError("y can not be zero")
		finally:
			print("over")

c = Calc()
c.x = 10
c.y = 20
# c.y = 0
c.calc()

可以将关于日志的配置放到配置文件中,从而更灵活,配置文件可以是conf文件、yaml文件、JSON文件、INI文件等,由于自己不写大型项目,这部分暂且略过。

 
 

参考资料

logging – Python的日志记录工具
Python Logging系列blog
Python中logging模块的基本使用(日志模块)
最棒总结!Python日志库 logging 使用指南来了
python日志:logging模块使用
python logging模块使用教程
Python之日志处理(logging模块)
Python实用教程系列——Logging日志模块

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值