1.Low-profilelogging日志分为以下五个级别。这五个级别从下往上匹配debug-->info-->warning-->error-->critical。默认的最低级别是警告级别。1.v1importlogginglogging.debug('调试信息')logging.info('正常信息')logging.warning('警告信息')logging.error('错误信息')logging.critical('严重错误信息')WARNING:root:警告信息ERROR:root:错误信息CRITICAL:root:严重错误信息v1版本无法指定日志级别;无法指定日志格式;它只能打印到屏幕上,不能写入文件。因此,代码可以改成如下。2.v2importlogging#日志的基本配置logging.basicConfig(filename='access.log',format='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s',datefmt='%Y-%m-%d%H:%M:%S%p',level=10)logging.debug('调试信息')#10logging.info('正常信息')#20logging.warning('warningmessage')#30logging.error('errormessage')#40logging.critical('severeerrormessage')#50可以在logging.basicConfig()函数中通过具体参数更改为默认模块的行为,可用的参数有:filename:创建一个指定文件名的FiledHandler(后面会详细解释handler的概念),这样日志就会存储在指定的文件中。filemode:文件打开方式,指定文件名时使用该参数,默认值为“a”,也可以指定“w”。format:指定handler使用的日志显示格式。datefmt:指定日期时间格式。level:设置rootlogger的日志级别(具体概念后面会解释)stream:创建一个指定流的StreamHandler。您可以指定输出到sys.stderr、sys.stdout或文件,默认为sys.stderr。如果同时列出文件名和流参数,则流参数将被忽略。格式参数中可能使用的格式字符串:%(name)s记录器名称%(levelno)s数值形式的日志级别%(levelname)s文本形式的日志级别%(pathname)s调用日志输出函数的模块%(filename)s的完整路径名,可以没有%(filename)s调用日志输出函数的模块的文件名%(module)s调用日志输出函数的模块名%(funcName)s调用日志输出函数的函数名%(lineno)d%(created)f调用日志输出函数的语句所在代码行的当前时间,用UNIX标准浮点数表示%(relativeCreated)d输出日志信息时,Logger创建后的毫秒数%(asctime)s当前时间为字符串。默认格式为“2003-07-0816:49:45,896”。逗号之后是毫秒级的%(thread)d线程ID。可能没有%(threadName)s线程名称。可能没有%(process)d进程ID。可能没有%(message)s用户输出的messagev2不能指定字符编码;它只能打印到文件中。3、v3logging模块包含四个角色:logger、Filter、Formatter对象、Handlerlogger:产生日志的对象Filter:过滤日志的对象Formatter对象:可以自定义不同的日志格式对象,然后绑定到不同的HandlerobjectstouseThis用于控制不同Handlers的日志格式Handler:接收日志并控制打印到不同的地方,FileHandler用于打印到文件,StreamHandler用于打印到终端'''critical=50error=40warning=30info=20debug=10'''导入logging#1.Logger对象:负责生成日志,然后交给Filter进行过滤,再交给不同的Handler输出logger=logging.getLogger(__file__)#2.Filterobject:不常用,省略#3.Handlerobject:从logger接收日志,然后控制输出h1=logging.FileHandler('t1.log')#打印到文件h2=logging.FileHandler('t2.log')#打印到文件sm=logging.StreamHandler()#打印到终端#4.Formatter对象:日志格式formmater1=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s',datefmt='%Y-%m-%d%H:%M:%S%p',)formatter2=logging.Formatter('%(asctime)s:%(message)s',datefmt='%Y-%m-%d%H:%M:%S%p',)formatter3=logging.Formatter('%(name)s%(message)s',)#5.绑定格式h1.setFormatter到Handler对象(formmater1)h2.setFormatter(formmater2)sm.setFormatter(formmater3)#6.给logger添加Handler并设置日志级别设置logger和handler#logger是第一级过滤,然后就可以去handlerlogger.setLevel(30)h1.setLevel(10))h2.setLevel(10)sm.setLevel(10)#7.测试logger.debug('debug')logger.info('info')logger.warning('warning')logger.error('error')logger.critical('critical')2.高配置日志记录1.配置日志文件我们下面的日志配置文件importosimportlogging.config#定义三种日志输出格式startstandard_format='[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'\'[%(levelname)s][%(message)s]'#wherename是getLogger()指定的名称;lineno是调用日志输出函数的名称该语句所在的代码行simple_format='[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format='[%(levelname)s][%(asctime)s]%(message)s'#定义日志输出格式endlogfile_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#日志文件的目录,需要自定义文件路径#atmlogfile_dir=os.path.join(logfile_dir,'log')#C:\Users\oldboy\Desktop\atm\loglogfile_name='log.log'#日志文件名,需要自定义路径名#如果没有定义的日志目录,如果没有则创建一个os.path.isdir(logfile_dir):#C:\Users\oldboy\Desktop\atm\logos.mkdir(logfile_dir)#日志文件的完整路径logfile_path=os.path.join(logfile_dir,logfile_name)#C:\Users\oldboy\Desktop\atm\log\log.log#定义日志路径结束#日志配置字典LOGGING_DIC={'version':1,'disable_existing_loggers':False,'formatters':{'standard':{'format':standard_format},'simple':{'format':simple_format},},'filters':{},#过滤器不能定义'handlers':{#打印到终端的日志'console':{'level':'DEBUG','class':'logging.StreamHandler',#打印到屏幕'formatter':'simple'},#打印到文件的log,收集info及以上的log'default':{'level':'INFO','class':'logging.handlers.RotatingFileHandler',#保存到文件'formatter':'standard','filename':logfile_path,#logfile'maxBytes':1024*1024*5,#logsize5M(*****)'backupCount':5,'encoding':'utf-8',#logfileEncoding,再也不用担心中文日志乱码了},},'loggers':{#logging.getLogger(__name__)获取的logger配置如果''设置为固定值logger1,那么下一次导入必须设置为logging.getLogger('logger1')'':{#在这里添加上面定义的两个handler,即日志数据都写入到文件并打印Toscreen'handlers':['default','console'],'level':'DEBUG','propagate':False,#passup(higherlevellogger)},},}defload_my_logging_cfg():logging.config.dictConfig(LOGGING_DIC)#导入上面定义的日志配置logger=logging.getLogger(__name__)#生成一个日志实例logger.info('Itworks!')#记录文件的运行状态returnloggerif__name__=='__main__':load_my_logging_cfg()2.使用日志importtimeimportloggingimportmy_logging#导入自定义日志记录配置logger=logging.getLogger(__name__)#生成记录器实例defdemo():logger.debug("startrange...time:{}".format(time.time()))logger.info("中文考试开始...")foriinrange(10):logger.debug("i:{}".format(i))time.sleep(0.2)else:logger.debug("overrange...time:{}".format(time.time()))logger.info("中文测试结果。。。")if__name__=="__main__":my_logging.load_my_logging_cfg()#在你的程序文件入口加载自定义日志配置demo()3.Django日志配置文件#logging_config.py#学习中遇到的问题没人回答吗?小编创建了一个Python学习交流群:711312441LOGGING={'version':1,'disable_existing_loggers':False,'formatters':{'standard':{'format':'[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]''[%(levelname)s][%(message)s]'},'simple':{'format':'[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'},'collect':{'format':'%(message)s'}},'filters':{'require_debug_true':{'()':'django.utils.log.RequireDebugTrue',},},'handlers':{#日志打印到终端'console':{'level':'DEBUG','filters':['require_debug_true'],'class':'logging.StreamHandler','formatter':'simple'},#打印日志到文件,收集信息及以上日志'default':{'level':'INFO','class':'logging.handlers.RotatingFileHandler',#自动保存到文件cut'filename':os.path.join(BASE_LOG_DIR,"xxx_info.log"),#logfile'maxBytes':1024*1024*5,#logsize5M'backupCount':3,'formatter':'standard','encoding':'utf-8',},#Logsprintedtofile:logcollectionerrorsandabove'error':{'level':'ERROR','class':'logging.handlers.RotatingFileHandler',#保存到文件,自动剪切'filename':os.path.join(BASE_LOG_DIR,"xxx_err.log"),#日志文件'maxBytes':1024*1024*5,#日志大小5M'backupCount':5,'formatter':'standard','encoding':'utf-8',},#日志打印到文件'collect':{'level':'INFO','class':'logging.handlers.RotatingFileHandler',#保存到文件,自动切'filename':os.path.join(BASE_LOG_DIR,"xxx_collect.log"),'maxBytes':1024*1024*5,#logsize5M'backupCount':5,'formatter':'collect','encoding':"utf-8"}},'loggers':{#通过logging.getLogger(__name__)''获取的logger配置'':{'handlers':['default','console','error'],'level':'DEBUG','propagate':True,},#通过logging.getLogger('collect')获得的记录器配置'collect':{'handlers':['console','collect'],'level':'INFO',}},}#----------#用法:获取两个loggerslogger=logging.getLogger(__name__)#在线正常日志collect_logger=logging.getLogger("collect")#leader说领导看到的日志需要为领导定制
