import logging
通过
logging.getLogger(name)
获取日志记录器对象,多次使用相同的名称会返回同一个Logger对象。若不指定名字(或直接使用logging)则返回root(根)Logger。以下记录方式是等价的:
logging.warning('warn')
root = logging.getLogger()
root.warning('warn')
Logger是层次结构的,使用 ‘.’ 点号分割,如’a’、‘a.b’或’a.b.c.d’,'a’是’a.b’的父parent,'a.b’是’a’的子child。以下两者是等价的:
loggerA = logging.getLogger('abc').getChild('def.ghi')
loggerA = logging.getLogger('abc.def.ghi')
默认生成的root logger的level是logging.WARNING
,低于该级别的就不输出了。可自定义级别,若自定义级别的数值与预定义的相同,则会覆盖掉预定义的。
级别 | 数值 |
---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
logging提供了针对不同级别的日志 输出函数:
debug
(msg, *args, **kwargs)info
(msg, *args, **kwargs)warning
(msg, *args, **kwargs)error
(msg, *args, **kwargs)critical
(msg, *args, **kwargs)log
(level, msg, *args, **kwargs)exception
(msg, *args, **kwargs):记录到ERROR级别
args 参数用于字符串格式化操,针对msg中的%
格式符。
kwargs 中会检查四个关键字参数: exc_info ,stack_info ,stacklevel 和 extra:
- exc_info 的求值结果不为 false ,则它将异常信息添加到日志消息中。如果提供了一个异常元组(按照
sys.exc_info()
返回的格式)或一个异常实例,则它将被使用;否则,调用 sys.exc_info()
以获取异常信息。 - stack_info,默认为
False
。如果为 True,则将堆栈信息(异常展开的栈信息)添加到日志消息中,包括实际的日志调用。 - stacklevel ,默认为
1
。如果大于 1 ,则在为日志记录事件创建的 LogRecord
中计算行号和函数名时,将跳过相应数量的堆栈帧。 - extra ,传递一个字典,该字典用于填充为日志记录事件创建的、带有用户自定义属性的
LogRecord
中的字典(字典的键不应与日志系统使用的键冲突) 。
如在日志中输出用户字典中的IP地址与用户信息:
FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('tcpserver')
info = {'clientip': '192.168.0.1', 'user': 'bob'}
logger.warning('Protocol problem: %s', 'connection reset', extra=info)
2021-11-20 22:20:02,165 192.168.1.2 bob Protocol problem: connection reset
Formatter负责将LogRecord转换为易于识别的字符串
logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)
LogRecord中属性用于将来自记录的数据合并到格式字符串中。
属性名称 | 格式 | 描述 |
---|
args | | 在原始日志记录调用中传入的格式字符串对应的参数。 |
asctime | %(asctime)s | 日志创建时间, 默认格式 ‘2021-07-08 16:49:45,896’ (逗号后为毫秒)。 |
msecs | %(msecs)03d | 日志创建时间的毫秒部分。 |
created | %(created)f | 日志创建时间,(即 time.time() 的返回值)。 |
exc_info | | 异常元组(例如 sys.exc_info )或者如未发生异常则为 None 。 |
filename | %(filename)s | pathname 的文件名部分。 |
funcName | %(funcName)s | 函数名包括调用日志记录. |
levelname | %(levelname)s | 日志级别:消息文本记录 |
levelno | %(levelno)s | 日志级别:数值 |
lineno | %(lineno)d | 源行号。 |
message | %(message)s | 记入日志的消息 |
module | %(module)s | 模块 (filename 的名称部分)。 |
msecs | %(msecs)d | 时间的毫秒部分。 |
msg | | 在原始日志记录调用中传入的格式字符串。 |
name | %(name)s | 用于记录调用的日志记录器名称。 |
pathname | %(pathname)s | 源文件的完整路径名。 |
process | %(process)d | 进程ID(如果可用) |
processName | %(processName)s | 进程名(如果可用) |
relativeCreated | %(relativeCreated)d | 相对于 logging 模块被加载时间的差值(毫秒数)。 |
stack_info | | 当前线程的堆栈帧信息。 |
thread | %(thread)d | 线程ID(如果可用) |
threadName | %(threadName)s | 线程名(如果可用) |
logging.basicConfig(**kwargs)
设定记录系统的基础配置。其关键参数:
格式 | 描述 |
---|
filename | 日志文件名 |
filemode | 日志文件打开模式, 默认为 'a' 。 |
format | 输出格式,默认为冒号分隔的 levelname , name 和 message (WARNING:root:output-message )。 |
datefmt | 日期/时间格式(time.strftime() 所接受的格式)。 |
style | *format *的格式字符串风格:
'%' :printf 风格(默认),%(message)s
'{' : str.format() 风格,{message} '$' :string.Template 风格 |
level | 记录级别 |
stream | 设定日志记录流;此参数与 filename 不兼容 (两者不能同时存在) |
handlers | 设定日志记录处理器,此参数与 filename 或 stream 不兼容 |
force | true时,移除并关闭附加到根记录器的所有现有处理器。 |
encoding | 输出文件的编码格式 |
errors | 输出文件在编码出错时的处理方式 |
设定日志输出格式
def init_logging(logFile=None):
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s.%(msecs)03d [%(levelname)s]: %(message)s',
datefmt='%H:%M:%S',
filename=logFile,
filemode='w')
if __name__ == '__main__':
init_logging()
logging.info("{} - times, output: {}".format(1, 'test-info'))
logging.info("%i - times, output: %s", 1, 'test-info')
同时输出到屏幕与日志文件(需要通过logger实现):
logger = logging.getLogger("base")
def init_logging(logFile=None, logLevel=logging.DEBUG):
for handler in logger.handlers[:]:
logger.removeHandler(handler)
logger.setLevel(logLevel)
formatter = logging.Formatter('%(asctime)s.%(msecs)03d [%(levelname)s] %(filename)s:%(lineno)d : %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
out = logging.StreamHandler()
out.setLevel(logLevel)
out.setFormatter(formatter)
logger.addHandler(out)
if logFile:
fh = logging.FileHandler(logFile)
fh.setLevel(logLevel)
fh.setFormatter(formatter)
logger.addHandler(fh)
if __name__ == '__main__':
init_logging("D:\\temp\\test.log")
logger.info("{} - times, output: {}".format(2, 'test-info'))
logger.info("%i - times, output: %s", 2, 'test-info')
文章目录记录器日志级别函数格式化器LogRecord默认配置示例一般简单输出使用print,但是要有大量输出,且做控制时,就需要做日志打印了。python中的logging模块可方便地进行日志打印。使用时:import logging记录器通过logging.getLogger(name)获取日志记录器对象,多次使用相同的名称会返回同一个Logger对象。若不指定名字(或直接使用logging)则返回root(根)Logger。以下记录方式是等价的:# 直接使用root Loggerloggin
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')输出:
WARNI
python的标准库logging提供了非常强大的日志记录功能,合适的日志输出对于调试代码可以提供非常大的帮助。这个库的基本用法非常的简单,这里不做赘述,而是记录一种稍微复杂的用法。
在项目开发的过程中,难免要引入第三方库,这些第三方库中大多也会用logging模块来进行日志记录。如果不加任何处理,那么很可能我们自己项目的日志中会夹杂许多第三方库的日志——而这些信息是我们不想要的,因此,要想一个办法,来阻止这些额外日志的输出。
2、利用logging.Filter来进行过滤
通过Filter的名字
logging日志的介绍
在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记录着飞机的飞行过程,那在咱们python程序中想要记录程序在运行时所产生的日志信息,怎么做呢?
可以使用 logging 这个包来完成
记录程序日志信息的目的是:
可以很方便的了解程序的运行情况
可以分析用户的操作行为、喜好等信息
方便开发人员检查bug
2. logging日志级别介绍
日志等级可以分为5个,从低到高分别是:
DEBUG
Python logging 模块是 Python 标准库中的一个模块,用于记录程序运行时的日志信息。使用 logging 模块可以方便地记录程序的运行状态,以便在出现问题时进行排查。
使用 logging 模块需要先导入模块,然后创建一个 logger 对象,设置日志级别和输出格式,最后在程序中使用 logger 对象记录日志信息。
下面是一个简单的示例代码:
import logging
# 创建 logger 对象
logger = logging.getLogger('mylogger')
# 设置日志级别
logger.setLevel(logging.DEBUG)
# 创建一个输出到控制台的 handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建一个输出到文件的 handler
file_handler = logging.FileHandler('mylog.log')
file_handler.setLevel(logging.INFO)
# 设置输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将 handler 添加到 logger 对象中
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志信息
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
在上面的示例代码中,我们创建了一个名为 `mylogger` 的 logger 对象,并设置了日志级别为 `DEBUG`。然后创建了一个输出到控制台的 handler 和一个输出到文件的 handler,并设置了输出格式。最后将这两个 handler 添加到 logger 对象中。
在程序中使用 logger 对象记录日志信息时,可以使用 `debug()`、`info()`、`warning()`、`error()`、`critical()` 等方法,分别对应不同的日志级别。例如,`logger.debug('debug message')` 就会记录一条 DEBUG 级别的日志信息。
以上就是 Python logging 模块的基本使用方法。