标签:ams href dax Matter lfs 配置 指南 oda xtu
为什么要使用logging?
比起print,logging更适合使用在项目中。logging可以方便的定制日志的格式,并且提供了日志分级,可以通过设置日志级别来决定哪些级别的日志可以输出。logging还提供了直接输出到文件的功能,logging可以满足大多数框架的日志需求。
基础
大模块分类:
Logger: 公开程序代码直接使用的接口
Handlers: 将日志发送到适当的目的地。
Filters: 提供了更细粒度的工具来确定输出哪些日志记录。
Formatters: 格式化程序在最终输出中指定日志记录的布局。
什么时候适合用logging呢?
执行的任务
|
最佳日志工具
|
需要控制台输出的程序
|
print()
|
报告程序运行期间的信息,或者错误信息(用于状态监控或错误调查)
|
loging.info(), (logging.erro()用于细致的调查)
|
发出特定运行时警告
|
warning.warn(): 如果报错时,客户端是可以改的。用这个。
logging.warning():如果客户端什么也不做,但还是需要记录信息。
|
记录异常日志,而不抛出异常(长时运行服务器的异常处理器)
|
loging.error(), logging.exception(), logging.critical()
|
日志级别:
Debug: 详细日志,,一般用于调查问题。
INFO: 确认用例按照预期的要求运行。
WARNING: 预示意外事件发生,或者将会在近期发生(如磁盘空间不足)。软件仍然正常工作中。
Error: 由于一个严重的问题,软件无法执行某些功能。
CRITICAL: 一个严重的问题,导致整个软件可能不无法正常运行。
默认级别是WARNING
logging基础使用
最简单的例子
logging.warning("test warning")
logging.info("test info")
输入日志到文件
logging.basicConfig(filename="testtest.log", level=logging.DEBUG)
logging.debug("test debug info to a file")
logging.info("test info to a file")
logging.warning("test warning to a file")
通过命令行配置日志等级
loglevel = "DEBUG"
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
raise ValueError(‘Invalid log level: %s‘ % loglevel)
logging.basicConfig(level=numeric_level)
注意事项:
basicConfig总是在第一次调用日志输出之前调用。之后调用日志输出就不再配置了。就算之后直接调用basicConfig也没有用。
这也可以带来另一个福利,只要在一个地方配置好logging后,就算是在其他模块中调用logging,也会输出到相同的地方。
使用logging输出变量
logging.warning(‘%s before you %s‘, ‘Look‘, ‘leap!‘)
配置输出日志的格式:
logging.basicConfig(format=‘%(asctime)s %(levelname)s %(message)s‘, datefmt=‘%m/%d/%Y %I:%M:%S %p‘)
asctime: 表示日期
datefmt:表示时间格式
levelname: log level的名称
message: 调用logging.warning时输出信息
logging支持的属性格式:
https://docs.python.org/3/library/logging.html#logrecord-attributes
时间格式化支持,和time.strfime一样。
https://docs.python.org/3/library/time.html#time.strftime
logging进阶
使用logger name来区分logger
在记录日志时,一个很好的约定是在每个日志记录模块使用一个模块级的日志记录程序
logger = logging.getLogger(__name__)
logger name可以支持层级模式,一看san.pdf就知道它是san的子模块。
默认的logger name是root
basicConfig:的默认format是:severity:logger name:message
handler的应用
handler主要是为了把不同的
使用示例:
-------------------------
logger = logging.getLogger()
logging.basicConfig(format=‘%(asctime)s %(levelname)s %(message)s‘, level=logging.DEBUG)
formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(message)s‘)
fh = logging.FileHandler("../log/test1.log")
fh.setLevel(logging.WARN)
fh.setFormatter(formatter)
logger.addHandler(fh)
debug_fh = logging.FileHandler("debug.log")
debug_fh.setLevel(logging.INFO)
debug_fh.setFormatter(formatter)
logger.addHandler(debug_fh)
logger.debug("test debug")
logger.info("test info")
logger.warning("test warn")
--------------------------
Filter的应用
filter,相当于logrecord会经过的地方,可以对所有的日志信息进行更精细化的定制。加了ip后,就可以通过format中的%(ip)-15s来把相应的值输出出来了。
--------------------
import logging
from random import choice
class MyFilter(logging.Filter):
IPS = ["10.12.13.233", "22.22.22.22"]
def filter(self, record):
record.ip = choice(MyFilter.IPS)
return True
if __name__ == ‘__main__‘:
filter = MyFilter()
logger = logging.getLogger()
logging.basicConfig(format="%(asctime)-15s %(ip)-15s %(message)s", level= logging.DEBUG)
logger.addFilter(MyFilter())
logger.setLevel(logging.DEBUG)
logger.warning("this is the warning info")
logger.critical("???")
--------------------
异常日志的捕获
python三的e,不能直接打印出异常日志了。
需要使用
traceback.print_exec()来打印异常日志
traceback.format_exc(): 返回的是字符串,用这个可以把异常信息输出到文件中。
print_exec(file=open("tb.txt", "w+")) 还可以接受file参数直接写入到一个文件中。