常用的3个日志文件类:StreamHandler、FileHandler、TimeRotatingFileHandler
1)StreamHandler:把日志输出到控制台
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import logging
import os.path
import time
from logging import handlers
class Logger(object):
def __init__(self):
# 在该路径下新建下级目录
new_name='/root/test/logs/'
#判断该目录是否存在
if not os.path.exists(new_name):
os.makedirs(new_name)
print(new_name + "目录创建成功")
try:
# 创建一个logger(初始化logger)
self.log = logging.getLogger()
self.log.setLevel(logging.DEBUG)
# 定义日志文件的路径以及名称
log_name = new_name + '/' + 'test.log'
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - '
'%(message)s')
# 判断条件,如果存在handlers则不创建,解决日志重复输出问题
if not self.log.handlers:
# StreamHandler 日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
self.log.addHandler(ch)
except Exception as e:
print("输出日志失败! %s" % e)
# 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
def info(cls,msg):
cls.log.info(msg)
return
def warning(cls,msg):
cls.log.warning(msg)
return
def error(cls, msg):
cls.log.error(msg)
return
2)FileHandler:把日志输出到指定文件
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import logging
import os.path
import time
from logging import handlers
class Logger(object):
def __init__(self):
# 在该路径下新建下级目录
new_name='/root/test/logs/'
#判断该目录是否存在
if not os.path.exists(new_name):
os.makedirs(new_name)
print(new_name + "目录创建成功")
try:
# 创建一个logger(初始化logger)
self.log = logging.getLogger()
self.log.setLevel(logging.DEBUG)
# 定义日志文件的路径以及名称
log_name = new_name + '/' + 'test.log'
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - '
'%(message)s')
# 判断条件,如果存在handlers则不创建,解决日志重复输出问题
if not self.log.handlers:
# FileHandler 日志输出到文件
fh = logging.FileHandler(log_name)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
self.log.addHandler(fh)
except Exception as e:
print("输出日志失败! %s" % e)
# 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
def info(cls,msg):
cls.log.info(msg)
return
def warning(cls,msg):
cls.log.warning(msg)
return
def error(cls, msg):
cls.log.error(msg)
return
3)TimeRotatingFileHandler:设置日志拆分逻辑,日志输出到指定文件
已最新的日志文件的开始时间开始算起,以以下设置为例,5分钟创建一个新文件
17:00开始,进行系统操作写日志,会创建一个test.log文件,日志写入此文件
待5分钟后,再次进行系统操作,则会按照test.log的开始时间+5是否大于当前时间,若大于,则test.log文件重新命名为test.log.202106211700.log(存放17:00 - 17:05的日志),并再次生成一个新的test.log(存放17:05 - 17:10的日志)
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import logging
import os.path
import time
from logging import handlers
class Logger(object):
def __init__(self):
# 在该路径下新建下级目录
new_name='/root/test/logs/'
#判断该目录是否存在
if not os.path.exists(new_name):
os.makedirs(new_name)
print(new_name + "目录创建成功")
try:
# 创建一个logger(初始化logger)
self.log = logging.getLogger()
self.log.setLevel(logging.DEBUG)
# 定义日志文件的路径以及名称
log_name = new_name + '/' + 'test.log'
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - '
'%(message)s')
# when 按什么日期格式切分,接收指定字符串参数
# “S”: Seconds
# “M”: Minutes
# “H”: Hours
# “D”: Days
# “W”: Week day (0=Monday)
# “midnight”: Roll over at midnight
# interval 是指等待多少个单位when的时间后,Logger会自动重建文件,这个文件的创建取决于filename + suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义不能因为when而重复。
# backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设为5,则在文件的创建过程中库会判断是否有超过这个5,若超过,则会从最先创建的开始删除。
# 判断条件,如果存在handlers则不创建,解决日志重复输出问题
if not self.log.handlers:
# TimedRotatingFileHandler 日志拆分
# rh = handlers.TimedRotatingFileHandler(log_name, when='midnight', interval=1, backupCount=5)
rh = handlers.TimedRotatingFileHandler(log_name, when='M', interval=5, backupCount=5)
rh.setLevel(logging.DEBUG)
# TimedRotatingFileHandler对象自定义日志级别
# rh.suffix = "%Y%m%d.log"
rh.suffix = "%Y%m%d%H%M.log"
rh.setFormatter(formatter)
self.log.addHandler(rh)
except Exception as e:
print("输出日志失败! %s" % e)
# 日志接口,用户只需调用这里的接口即可,这里只定位了INFO, WARNING, ERROR三个级别的日志,可根据需要定义更多接口
def info(cls,msg):
cls.log.info(msg)
return
def warning(cls,msg):
cls.log.warning(msg)
return
def error(cls, msg):
cls.log.error(msg)
return