参考官网 https://docs.python.org/3/library/logging.htmlhtml
https://docs.python.org/3/library/logging.handlers.htmlpython
logging日志模块服务器
包含logger,handler,filter,formatter。app
logger:提供日志接口,供应用代码使用。logger最长用的操做有两类:配置和发送日志消息。能够经过logging.getLogger(name)获取logger对象,若是不指定name则返回root对象,屡次使用相同的name调用getLogger方法返回同一个logger对象。
handler:将日志记录(log record)发送到合适的目的地(destination),好比文件,socket等。一个logger对象能够经过addHandler方法添加0到多个handler,每一个handler又能够定义不一样日志级别,以实现日志分级过滤显示。
filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
formatter:指定日志记录输出的具体格式。formatter的构造方法须要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。、socket
简单日志可直接调用basicConfig函数
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s %(levelname)s %(message)s', datefmt='%a, %m-%d-%Y %H:%M:%S', #datefmt='%A, %d %b %Y %H:%M:%S' filename='app.log', filemode='a') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message')
结果输出this
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format能够输出不少有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING 日志级别CRITICAL >ERROR >WARNING >INFO >DEBUG
stream: 指定将日志的输出流,能够指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略spa
方法二利用handler过来线程
logging.StreamHandler: 日志输出到流,能够是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler
logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler: 远程输出日志到UDP sockets
logging.handlers.SMTPHandler: 远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 经过"GET"或"POST"远程输出到HTTP服务器debug
#coding=utf-8 import logging log_file = "text_debug.log" #log_level = logging.DEBUG logger = logging.getLogger() handler1 = logging.FileHandler(log_file) #console = logging.StreamHandler() 屏幕输出 handler2 = logging.FileHandler('text_error.log') formatter = logging.Formatter("%(asctime)s %(filename)s %(levelname)s %(message)s",datefmt='%a, %m-%d-%Y %H:%M:%S') handler1.setFormatter(formatter) #console.setFormatter(formatter) handler2.setFormatter(formatter) handler1.setLevel(logging.DEBUG) handler2.setLevel(logging.ERROR) logger.setLevel(logging.NOTSET) #logging.getLogger('')的默认日志级别为warning,要想handler级别生效必须改成notset或者更低级别 logger.addHandler(handler1) #debug及以上日志 logger.addHandler(handler2) #error及以上日志 logger.debug("this is a debug message!") logger.info("this is a info message!") logger.warning("this is a warn message!") logger.error("this is a error message!") logger.critical("this is a critical message!")
结果输出
日志轮替
以文件大小切割
#!/usr/bin/python #coding=utf-8 import logging.handlers import logging log_level=logging.DEBUG log_file='ceshi.log' log_max_byte=100*1024*1024 #日志切割大小100M log_backup_count=5 #预留文件数 logger = logging.getLogger("") logger_cut=logging.handlers.RotatingFileHandler(log_file,'a',log_max_byte,log_backup_count) formatter = logging.Formatter("%(asctime)s %(filename)s %(levelname)s %(message)s",datefmt='%a, %m-%d-%Y %H:%M:%S') logger.setLevel(log_level) #或设置logger级别为notset,用handler过滤 logger_cut.setFormatter(formatter) logger.addHandler(logger_cut) while True: logger.debug("this is a debug message!") logger.info("this is a info message!") logger.warning("this is a warn message!") logger.error("this is a error message!") logger.critical("this is a critical message!")
结果输出
以时间切割
import logging.handlers import logging import time log_level=logging.DEBUG log_file='ceshi.log' logger = logging.getLogger() time_cut=logging.handlers.TimedRotatingFileHandler(filename=log_file,when='S',interval=2,backupCount=3) formatter = logging.Formatter("%(asctime)s %(filename)s %(levelname)s %(message)s",datefmt='%a, %m-%d-%Y %H:%M:%S') time_cut.setFormatter(formatter) logger.setLevel(log_level) time_cut.suffix="%Y-%m-%d_%H-%M-%S" #若是设定是天,就必须写成"%Y-%m-%d"其余格式不生效 logger.addHandler(time_cut) while True: time.sleep(1) logger.debug("this is a debug message!") logger.info("this is a info message!") logger.warning("this is a warn message!") logger.error("this is a error message!") logger.critical("this is a critical message!")
when参数详解
配置文件参考官网 https://docs.python.org/3/library/logging.config.html
配置文件logging.conf
##################logging配置################## [loggers] keys=root,text,user,dest [logger_root] level=DEBUG handlers=handler01,handler02 [logger_text] handlers=handler01,handler02 qualname=text propagate=0 [logger_user] #user采用文件100M日志轮替 handlers=handler01,handler03 qualname=user propagate=0 [logger_dest] #dest采用天天日志轮替 handlers=handler01,handler04 qualname=dest propagate=0 #################handlers配置################### [handlers] keys=handler01,handler02,handler03,handler04 [handler_handler01] class=StreamHandler level=DEBUG formatter=formatter02 args=(sys.stdout,) [handler_handler02] class=FileHandler level=DEBUG formatter=formatter01 args=('myapp.log', 'a') [handler_handler03] class=handlers.RotatingFileHandler level=INFO formatter=formatter02 args=('size_cut.log','a',100*1024*1024,5) [handler_handler04] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=formatter03 args=('time_cut.log','D',1,5) ###################formatters格式化#################### [formatters] keys=formatter01,formatter02,formatter03 [formatter_formatter01] format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s datefmt=%a, %d %b %Y %H:%M:%S [formatter_formatter02] format=%(name)-12s: %(levelname)-8s %(message)s datefmt= [formatter_formatter03] format=%(name)s %(asctime)s %(filename)s %(levelname)s %(message)s datefmt='%a, %m-%d-%Y %H:%M:%S'
代码
import logging import logging.config logging.config.fileConfig("logging.conf") logger = logging.getLogger("dest") while True: logger.debug("this is a debug message!") logger.info("this is a info message!") logger.warning("this is a warn message!") logger.error("this is a error message!") logger.critical("this is a critical message!")