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!")
相关文章
相关标签/搜索