參考官網 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!")