'''
date:2019-06-28
autor:wangxc
功能:
1.写日志功能,当没有传入日志写入路径时,他会将 本文件名.log 的日志文件存放到脚本同路径下
例子:脚本路径在c:logger.py,那么生成的日志文件logger.log将会在c:下存在
2.可以传入日志的级别,控制日志输出的形式,如何配置日志输出形式,可以看下面注释
'''
import logging
import os,sys
from logging.handlers import RotatingFileHandler
'''
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
'''
#用字典保存日志级别 日志输出的形式
format_dict = {
1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(levelno)s - %(pathname)s - %(filename)s - %(module)s - %(funcName)s - %(lineno)d - %(thread)d - %(threadName)s - %(process)d'),
2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}
# 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
class Logger():
def __init__(self, logname, loglevel, logger="logger"):
path = os.path.split(sys.argv[0])[0]
filename = os.path.split(sys.argv[0])[-1]
log_file = filename.split(".")[0] + ".log"
#日志输出具体路径
log_path = os.sep.join([path,log_file])
# 创建一个logger
self.logger = logging.getLogger(logger)
#设置日志打印的级别
#如果设置成ERROR,则只会打印ERROR日志信息
#如果设置成INFO,则会打印出INFO和ERROR的日志信息
#如果设置成DEBUG,则会打印ERROR,INFO和ERROR的日志信息
self.logger.setLevel(logging.DEBUG)
#判断日志路径,不存在创建
if not os.path.exists(logname):
os.makedirs(logname)
# 创建一个handler,用于写入日志文件
#fh = logging.FileHandler(logname,mode='w',encoding='UTF-8')
#fh.setLevel(logging.DEBUG)
# 定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
fh = RotatingFileHandler(log_path,encoding='UTF-8', maxBytes=1 * 1024 * 1024, backupCount=5)
#控制输出到日志文件的日志级别
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
#控制输出到控制台的日志级别
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter = format_dict[int(loglevel)]
#同时在控制台和日志中输出,可以按个人需求修改
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
if __name__ == '__main__':
#测试
logger = Logger(logname='C:/Users/Administrator/Desktop/a/', loglevel=1, logger="ww").getlog()
i = 0
while(i<10):
logger.error('this is error')
logger.debug('this is debug')
logger.info('this is info')
i = i + 1