python标准库自带的日志模块
需要导入日志模块
import logging
Logging 中几种级别:DEBUG < INFO < WARNING < ERROR < CRITICAL
日志等级 | 描述 |
---|---|
DEBUG | 调试信息通常在诊断问题的时候用得着 |
INFO | 普通信息认程序按照预期运行 |
WARNING | 警告信息表示发生意想不到的事情或者指示接下来可能会出现一些问题但是程序还是继续运行 |
ERROR | 错误信息程序运行中出现了一些问题程序某些功能不能执行 |
CRITICAL | 危险信息一个严重的错误导致程序无法继续运行 |
#设置日志级别 注意大写
logging.basicConfig(level=logging.INFO)
# debug调试信息
logging.debug('this is debug')
# 普通信息
logging.info('this is debug')
# 警告信息
logging.warning('this is debug')
# 错误信息
logging.error('this is debug')
# 危险信息
logging.critical('this is critical')
#当级别不够INFO等级的,不会提示
格式 | 描述 |
---|---|
%(asctime)s | 日志事件发生的时间 |
%(levelname)s | 该日志记录的日志级别 |
%(message)s | 日志记录的文本内容 |
**%(name)s | 所使用的日志器名称,默认是’root’ |
%(pathname)s | 调用日志记录函数的文件的全路径 |
%(filename)s | 调用日志记录函数的文件 |
%(funcName)s | 调用日志记录函数的函数名 |
%(lineno)d | 调用日志记录函数的代码所在的行号 |
logging.basicConfig(level=logging.INFO,format ='时间:%(asctime)s 日志级别:%(levelname)s 日志内容:%(message)s 行数:%(lineno)d')
logging.basicConfig(level = logging.INFO, #写入的级别
format='%(asctime)s,%(filename)s,%(lineno)s', #写入文件的格式
filename='jiuchengdebug.log', #写入文件的文件名
filemode='a+') #写入的模式
logging模块还提供了模块化组件的方法来灵活配置日志记录器
组件 | 说明 |
---|---|
Loggers(日志记录器) | 提供程序直接使用的接口 |
Handlers(日志处理器) | 将记录的日志发送到指定的位置 |
Filters(日志过滤器) | 用于过滤特定的日志记录 |
Formatters(日志格式器) | 用于控制日志信息的输出格式 |
流程如下
import logging
# 创建一个logger
my_logger = logging.getLogger('test_log')
# 设置级别
my_logger.setLevel(logging.DEBUG)
# 定义handler
# 在控制台输出
my_handCmd = logging.StreamHandler()
my_handCmd.setLevel(logging.DEBUG)
# 在文件中显示
my_handFile = logging.FileHandler('ftest.log', encoding='utf-8',mode='a+')
my_handFile.setLevel(logging.DEBUG)
# 格式化输出
Cmdformatter = logging.Formatter(
'时间:%(asctime)s,'
'日志级别:%(levelname)s'
'日志消息:%(message)s'
)
Fileformatter = logging.Formatter('时间:%(asctime)s,日志级别:%(levelname)s,日志内容:%(message)s,行数:%(lineno)d')
# 以什么样的格式输出
my_handCmd.setFormatter(Cmdformatter)
my_handFile.setFormatter(Fileformatter)
# 将logger添加到handle里面
my_logger.addHandler(my_handCmd)
my_logger.addHandler(my_handFile)
#使用
# debug调试信息
my_logger.debug('this is debug')
# 普通信息
my_logger.info('this is debug')
# 警告信息
my_logger.warning('this is debug')
# 错误信息
my_logger.error('this is debug')
# 危险信息
my_logger.critical('this is critical')
#以上代码就实现了一个同时在控制台输出日志信息和文件写入日志信息的日志管理器
import logging
class My_logger:
def __init__(self,log_name,log_level = logging.DEBUG,log_file = 'myfile.log'):
"""
:param log_name: 日志名称
:param log_level:日志级别
:param log_file:日志文件名
"""
self.logger_name = log_name
self.logger_lever = log_level
self.logger_file = log_file
#创建logger对象
def create_Logger(self):
my_logger = logging.getLogger(self.logger_name)
my_logger.setLevel(self.logger_lever)
#创建文件处理器
my_handFile = logging.FileHandler(self.logger_file, encoding='utf-8', mode='a+')
my_handFile.setLevel(self.logger_lever)
#创建控制台处理器,在控制台输出
my_handCmd = logging.StreamHandler()
my_handCmd.setLevel(self.logger_lever)
# 设置输出格式
Cmd_formatter = logging.Formatter('时间:%(asctime)s,'
'日志级别:%(levelname)s,'
'消息文件:%(filename)s,'
'日志内容:%(message)s,'
'行数:%(lineno)d。'
'\r\n\n')
File_formatter = logging.Formatter('时间:%(asctime)s,'
'日志级别:%(levelname)s,'
'消息文件:%(filename)s,'
'日志内容:%(message)s,'
'行数:%(lineno)d。'
'\r\n\n')
# 以什么样的格式输出,将格式添加到处理器中
my_handCmd.setFormatter(Cmd_formatter)
my_handFile.setFormatter(File_formatter)
# 将handle添加到logger里面
my_logger.addHandler(my_handCmd)
my_logger.addHandler(my_handFile)
#返回创建的logger对象
return my_logger
if __name__ == '__main__':
log = My_logger('my',logging.DEBUG).create_Logger()
try:
print(a)
except Exception as e:
log.debug(e)