python模块--logging模块

本文深入解析Python的logging模块,涵盖日志级别的设定、日志输出的定制化、日志文件的管理和日志信息的格式化。同时,介绍了如何通过字典配置实现复杂日志系统,包括日志切割、日志远程输出及多目标输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 logging模块

日志级别:debug<info<warning<error<critical

# 默认日志级别为warning

简单将日志打印到屏幕
>>> logging.debug('test debug')
>>> logging.info('test info')
>>> logging.warning('test warning')  
WARNING:root:test warning
>>> logging.error('test error')
ERROR:root:test error
>>> logging.critical('test critical')
CRITICAL:root:test critical

通过logging.basicConfig()方法 自定义日志输入位置,日志格式,级别等

logging.basicConfig()可通过具体参数来更改logging模块默认行为,参数:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。format 参数中有 asctime 的话,需要使用 datefmt 指定格式
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。


format参数中可能用到的格式化串:
%(name)s  Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息 
#日志输入到屏幕
import logging
logging.basicConfig(
                    level=logging.WARNING,
                    format='%(asctime)s 【%(name)s】 %(filename)s %(levelname)s  %(message)s ', 
                    datefmt = "%Y/%m/%d %H:%M:%S",
                    )
logger = logging.getLogger(__name__)    #format里面的name打印的就是这里定义的Logger
logger.info('test info')
logger.warning('test warning')
logger.error('test error')
#控制台结果:
2018/11/28 18:04:25 【__main__】 test.py WARNING  test warning 
2018/11/28 18:04:25 【__main__】 test.py ERROR  test error 

# 把日志输入到文件
import logging
logging.basicConfig(filename='test.log',
                    filemode='w',
                    level=logging.WARNING,
                    format='%(asctime)s %(filename)s %(levelname)s  %(message)s ',
                    datefmt = "%Y/%m/%d %H:%M:%S",
                    )
logging.info('test info')
logging.warning('test warning')
logging.error('test error')

#结果:test.log:
2018/11/28 16:05:19 test.py WARNING  test warning 
2018/11/28 16:05:19 test.py ERROR  test error 

 

  • logger 提供应用程序可以调用的接口
  • handler 把logger创建的日志输出到合适的目标
  • filter 过滤 选择什么日志应该输出
  • formatter 指定日志输出格式

 

把日志同时输出到屏幕和文件里 

 

# 步骤:
  • 创建logger
  • 创建handler
  • 定义formatter
  • 给handler添加formatter
  • 给logger添加handler
import logging
#创建logger
logger = logging.getLogger("LOGGER")
logger.setLevel(logging.WARNING)   #可以在logger或者hanndler设置日志级别。全谁的level高就使用谁的
#创建一个handler(输出到控制台的)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)    #被全局覆盖
#创建一个handler(输出到文件的)
file_handler = logging.FileHandler('test.log')
file_handler.setLevel(logging.ERROR)    # 没有被覆盖

#创建formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#给handler添加Formatter
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.debug('test debug')
logger.info('test info')
logger.warning('test warning')
logger.error('test error')
logger.critical('test critical')

 

handler

StreamHandler  日志输出到流,可以是sys.stderr,sys.stdout或者文件

#日志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr。
class logging.StreamHandler(stream=None)  

FileHandler    日志输出到文件

class logging.FileHandler(filename,mode ='a',encoding = None,delay = False )
#模式默认为append,delay为true时,文件直到emit方法被执行才会打开。默认情况下,日志文件可以无限增大

BaseRotatingHandler  基本的日志切割方式,RotatingFileHandler和TimeRotatingHandler两个类继承此类

RotatingFileHandler  日志输出到文件,并且当文件达到一定大小时,会产生新文件

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
#参数maxBytes和backupCount, 当日志文件size大于等于maxBytes时,就会新创建一个日志文件。backupcount是文件数目。
例如maxBytes=1024,backupCount=3时,
日志app.log如果达到1024,则会产生另外三个文件app.log.1,app.log.2,app.log.3。当这两个参数中间任一个为0时,都不会发生rollover

TimeRotatingHandler  日志rollover方式,间隔一段时间就自动创建新的文件

logging.handlers.TimedRotatingFileHandler(filename,when='h',interval=1,backupCount=0,encoding=No,nedelay=False,utc=False,atTime=None)
# when参数可以指定时间间隔的单位,不区分大小写。
S 秒
M 分
H 小时
D 天
'W0'-'W6' 星期 ('W0'星期一,...'W6'星期天)
midnight 每天凌晨
# interval 指定时间间隔

SocketHandler  远程输出日志到TCP/IP sockets

DatagramHandler  远程输出日志到UDP sockets

SMTPHandler  远程输出日志到邮件地址

SysLogHandler  日志输出到syslog

NTEventLogHandler   远程输出日志到Windows NT/2000/XP的事件日志

MemoryHandler   日志输出到内存中的指定buffer

HTTPHandler   通过"GET"或者"POST"远程输出到HTTP服务器

 

以字典的方式配置

使用 logging.config模块

把字典传给logging.config.dictConfig():    logging.config.dictConfig(DIC_CONFIG)

字典配置
必须包含的键:
version  目前唯一有效值为1
可选的键有:
formatters   
filters 
handlers:  class(必选)
            level(可选)
            formatter(可选)
            filters(可选)

loggers:  level(可选)   
          propagate(可选)   
          filters(可选)
          handlers(可选)
         
root: root logger配置,配置和logger配置一样,但是没有propagate配置不适用
incremental:  默认False。如果为True,表示增量配置
disable_existing_loggers:  默认为True。是否要禁用现有的logger

 

示例:

import logging.config
DIC_CONFIG = {
    "version":1,
    #设置formatter
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        },
        "standard":{
            "format":"%(asctime)s - %(threadName)s:%(thread)s - %(name)s - %(filename)s -  %(levelname)s - %(message)s"
        }
    },
    "handlers":{
        #打印到终端的handler
        "console":{
            "class":"logging.StreamHandler",     #输出到屏幕的handler类型
            "level":"DEBUG",
            "formatter":"simple",    #给handler添加formatter
        },
        #打印到文件的handler
        "file_handler":{
            "class":"logging.handlers.RotatingFileHandler",  #输出到文件的handler类型
            "level":"INFO",
            "formatter":"standard",    #给handler添加formatter
            "filename":"access.log",
            "maxBytes":1024*1024*8,  #当文件大于等于这个值时,产生3个文件
            "backupCount":3,
            "encoding":"utf8"
        },
        #错误日志输出到另一个文件
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"standard",
            "filename":"errors.log",
            "maxBytes":1024*1024*3,
            "backupCount":3,
            "encoding":"utf8"
        }
    },
    "loggers":{
        "my_logger":{
            "level":"DEBUG",
            "handlers":["console","file_handler","error_file_handler"],   #将handler添加到logger
            "propagate":True
        }
    },
    "root":{  #可以不写
        "level":"INFO",
        "handlers":["console","file_handler","error_file_handler"]
    },
    "disable_existing_loggers":False, #不禁用现有的loggers
}

logging.config.dictConfig(DIC_CONFIG)
logger = logging.getLogger(__name__) # 生成一个log实例 logging.info(
"hi")

 

转载于:https://www.cnblogs.com/xiaobaozi-95/p/9958872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值