python logging模塊詳解

參考官網 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!")
相關文章
相關標籤/搜索