python学习笔记九

微信公众号: 点击蓝色字体小白图像与视觉进行关注

关于技术、关注yysilence00。有问题或建议,请公众号留言

下面主要讲标准库之日志logging

  • 整理知识,学习笔记
  • 发布日记,杂文,所见所想

日志级别:
- CRITICAL 50
- ERROR 40
- WARNING 30
- INFO 20
- DEBUG 10

logging.basicConfig()函数中的具体参数含义

- filename:指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中;
- filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“w”还可指定为“a”;
- format:指定handler使用的日志显示格式;
- datefmt:指定日期时间格式。,格式参考strftime时间格式化(下文)
- level:设置rootlogger的日志级别
- stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

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	用户输出的消息

#1.先看一个简单的例子
使用logging打印日志到标准输出

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

输出:

WARNING: root :Watch out!

#2.再看另外一个例子

"""
pycharm 中自动补全代码提示符前的符号解释
p: parameter参数
m: method 方法
c: class 类
v: variable变量
f: fired字段orfunction函数

"""
"""
pycharm 中自动补全代码提示符前的符号解释
p: parameter参数
m: method 方法
c: class 类
v: variable变量
f: fired字段orfunction函数

日志级别:
 最高   CRITICAL 50
        ERROR 40
        WARNING 30
        INFO 20
 最低   DEBUG 10

"""
import logging

#print(dir(logging))

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(module)s - %(filename)s - %(levelname)s : %(message)s',
    #datefmt='%Y-%m-%d %A %H:%M:%S',

)
# logging 是一个模块 它调用自己的函数getLogger()返回给实例变量(即对象)
logger = logging.getLogger(__name__)
# logger是实例变量(即对象)调用自己的方法Method()   info()等等
logger.info("start print log")
logger.debug("do something")
logger.warning("Something maybe fail.")
logger.info("Finish")


2019-12-08 20:49:42,800 - logging_test - logging_test.py - INFO : start print log
2019-12-08 20:49:42,801 - logging_test - logging_test.py - WARNING : Something maybe fail.
2019-12-08 20:49:42,801 - logging_test - logging_test.py - INFO : Finish

上面两个案例说明python默认输出的最高级别是warning

#3.使用logging.baseConfig()将日志输入到文件

# 使用logging打印日志到标准输出
"""
logger:产生日志的对象

Filter:过滤日志的对象

Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

"""
import os
import logging

logging.debug('调试debug')  # DEBUG = 10
logging.info('消息info')  # INFO = 20
logging.warning('警告warn')  # WARNING = 30
logging.error('错误error')  # ERROR = 40
logging.critical('严重critical')  # CRITICAL = 50

'''
WARNING:root:警告warn
ERROR:root:错误error
CRITICAL:root:严重critical
'''
logging.basicConfig(
    filename=os.path.join(os.getcwd(),'test2.log'),
    level=logging.DEBUG,
    format='%(asctime)s  %(filename)s : %(name)s : %(levelname)s  %(message)s',  # 定义输出log的格式
    filemode='a',
    datefmt='%Y-%m-%d %A %H:%M:%S',
)
logging.debug('this is a message')

在test2.log文件中输出下面内容

2019-12-07 Saturday 12:04:13  stalid_logging_1.py : DEBUG  this is a message

#4.logging 4种常用对象

  • logger:产生日志的对象
  • Filter:过滤日志的对象
  • Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
  • Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
import logging

logger=logging.getLogger()
# 创建一个handler 用于写入日志
fh = logging.FileHandler('test4.log', encoding='utf-8')

# 在创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#logger对象可以添加多个fh和ch对象
logger.addHandler(fh)
logger.addHandler(ch)

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

在文件test4.log输出

2019-12-08 20:59:59,177 - root - WARNING - logger warning message
2019-12-08 20:59:59,178 - root - ERROR - logger error message
2019-12-08 20:59:59,178 - root - CRITICAL - logger critical message

#5.设置按照日志文件大小自动分割日志写入文件

import logging
from logging import handlers


class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }

    def __init__(self, filename, level='info', when='D', backCount=3,
                 fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)  # 设置日志格式
        self.logger.setLevel(self.level_relations.get(level))  # 设置日志级别

        # 向控制台输出日志
        stream_handler = logging.StreamHandler()
        stream_handler.setFormatter(format_str)
        self.logger.addHandler(stream_handler)

        # 日志按文件大小写入文件
        # 1MB = 1024 * 1024 bytes
        # 这里设置文件的大小为500MB
        rotating_file_handler = handlers.RotatingFileHandler(
            filename=filename, mode='a', maxBytes=1024 * 1024 * 500, backupCount=5, encoding='utf-8')
        rotating_file_handler.setFormatter(format_str)
        self.logger.addHandler(rotating_file_handler)


log = Logger('all.log', level='info')

log.logger.info('[测试log] hello, world')

#6.按照间隔日期自动生成日志文件

import logging
from logging import handlers


class Logger(object):
    level_relations = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'crit': logging.CRITICAL
    }

    def __init__(self, filename, level='info', when='D', backCount=3,
                 fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)  # 设置日志格式
        self.logger.setLevel(self.level_relations.get(level))  # 设置日志级别

        # 往文件里写入
        # 指定间隔时间自动生成文件的处理器
        timed_rotating_file_handler = handlers.TimedRotatingFileHandler(
            filename=filename, when=when, backupCount=backCount, encoding='utf-8')

        # 实例化TimedRotatingFileHandler
        # interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
        # S 秒
        # M 分
        # H 小时、
        # D 天、
        # W 每星期(interval==0时代表星期一)
        # midnight 每天凌晨
        timed_rotating_file_handler.setFormatter(format_str)  # 设置文件里写入的格式
        self.logger.addHandler(timed_rotating_file_handler)

        # 往屏幕上输出
        stream_handler = logging.StreamHandler()
        stream_handler.setFormatter(format_str)
        self.logger.addHandler(stream_handler)


log = Logger('all.log', level='info')
log.logger.info('[测试log] hello, world')

#7.Logger的继承(了解)

import logging

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S %p', )

ch = logging.StreamHandler()
ch.setFormatter(formatter)

logger1 = logging.getLogger('root')
logger2 = logging.getLogger('root.child1')
logger3 = logging.getLogger('root.child1.child2')

logger1.addHandler(ch)
logger2.addHandler(ch)
logger3.addHandler(ch)
logger1.setLevel(10)
logger2.setLevel(10)
logger3.setLevel(10)

logger1.debug('log1 debug')
logger2.debug('log2 debug')
logger3.debug('log3 debug')

输出

2019-12-08 21:06:55 PM - root - DEBUG -stalib_logging_4:  log1 debug
2019-12-08 21:06:55 PM - root.child1 - DEBUG -stalib_logging_4:  log2 debug
2019-12-08 21:06:55 PM - root.child1 - DEBUG -stalib_logging_4:  log2 debug
2019-12-08 21:06:55 PM - root.child1.child2 - DEBUG -stalib_logging_4:  log3 debug
2019-12-08 21:06:55 PM - root.child1.child2 - DEBUG -stalib_logging_4:  log3 debug
2019-12-08 21:06:55 PM - root.child1.child2 - DEBUG -stalib_logging_4:  log3 debug

更多请扫码关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值