一、logging的基础使用

1、logging的级别

import logging
logging.debug('debug message') # 计算或者工作的细节
logging.info('info message') # 记录一些用户的增删改查的操作
logging.warning('warning operation') # 警告操作
logging.error('error message') # 错误操作
logging.critical('critical message') # 致命的错误 直接导致程序出错退出的 结果:
WARNING:root:warning operation
ERROR:root:error message
CRITICAL:root:critical message 从上面可以看出:
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于warning级别的日志,
这说明默认的日志级别设置为WARNING(日志级别等级critical > error > warning > info > debug),
默认的日志格式为日志级别:level级别:用户:输出消息。
 

2、简单配置

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

import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M', # 把asctime的时间格式改为:年-月-日 时:分
filename='test.log',
filemode='w') logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
(简单配置中文显示的是乱码) 参数说明:
level:设置logger的日志级别(大于等于这个参数的级别都会显示)
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),
默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串:
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒(可用datefmt修改默认日期时间格式。)
%(filename)s 调用日志输出函数的模块的文件名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(levelname)s 日志级别
%(message)s用户输出的消息
%(name)s 用户的名字 %(levelno)s 数字形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有

3、对象的配置

import logging

logger = logging.getLogger()  # 创建一个log对象
logger.setLevel(logging.DEBUG) # 设置显示级别 # 还要创建一个控制文件输出的文件操作符
fh = logging.FileHandler('mylog.log', encoding='utf-8') # 指定编码可以解决中文乱码问题 # 还要创建一个控制屏幕输出的屏幕操作符
sh = logging.StreamHandler() # 要创建一个格式(多个格式也可以)
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s [line:%(lineno)d]') # 文件操作符绑定一个格式
fh.setFormatter(fmt)
# fh.setLevel(logging.WARNING) # 可以设置写入文件的级别,不设置的话就默认用log对象设置的级别(一般全部级别的信息都写进去) # 屏幕操作符绑定一个格式
sh.setFormatter(fmt)
sh.setLevel(logging.WARNING) # 可以设置屏幕打印的级别,不设置的话就默认用log对象设置的级别
# 但是不能设置比log对象设置的级别低,否则只会执行log对象的级别,比如:log对象设置的级别是WARNING,你这里设置INFO,级别
# 没有WARNING高,不会显示 # logger对象来绑定:文件操作符, 屏幕操作符
logger.addHandler(sh)
logger.addHandler(fh) logger.debug('debug message') # 计算或者工作的细节
logger.info('info message') # 记录一些用户的增删改查的操作
logger.warning('warning message') # 警告操作
logger.error('error message') # 错误操作
logger.critical('critical message') # 批判的 直接导致程序出错退出的

4、工作中的使用案例

import logging

def init_log(data):
log_id = data.get("log_id", None) # 从参数中获取日志id
logger = logging.getLogger(str(log_id)) # 根据log_id创建一个log对象
logger.setLevel(logging.INFO) # 设置显示级别 # 避免重复生成新的logger,日志多次写入的问题
# 避免这种情况:第一条记录写一次,第二条记录写两次,第三条记录写三次
if not logger.handlers:
fh = logging.FileHandler('mylog.log', encoding='utf-8') # 创建一个控制文件输出的文件操作符
# 创建一个日志输出格式
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s [line:%(lineno)d]')
# 文件操作符绑定一个格式
fh.setFormatter(fmt)
# fh.setLevel(logging.WARNING) # 可以设置写入文件的级别,不设置的话就默认用log对象设置的级别 # logger对象来绑定:文件操作符
logger.addHandler(fh) def write_log(data):
log_id = data.get("log_id", None) # 从参数中获取日志id
logger = logging.getLogger(str(log_id)) # 根据log_id创建一个log对象
# 在需要打印日志的地方,直接打印日志即可,上面的init_log已经实例化完毕
logger.error("错啦!")

二、自动删除功能

1、通过时间设置备份并删除

通过TimedRotatingFileHandler可以把输出重定向到文件,它会对比文件最后修改时间和当前时间,如果比设置的时候大,则会把当前文件加时间后缀备份,然后,新建一个进行Log。

import logging
from logging.handlers import TimedRotatingFileHandler def init_log(data):
log_id = data.get("log_id", None)
logger = logging.getLogger(str(log_id))
logger.setLevel(logging.INFO) if not logger.handlers:
# 这里设置成TimedRotatingFileHandler
# 创建一个由时间控制的文件操作符:每天生成一个文件
tfh = TimedRotatingFileHandler(filename='mylog.log', when="D", interval=1, backupCount=3)
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s [line:%(lineno)d]')
tfh.setFormatter(fmt)
logger.addHandler(tfh) def write_log(data):
log_id = data.get("log_id", None)
logger = logging.getLogger(str(log_id))
# 在需要打印日志的地方,直接打印日志即可,上面的init_log已经实例化完毕
logger.error("错啦!")
  • filename:日志文件名的prefix;
  • when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
  • interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件;
  • backupCount: 表示日志文件的保留个数;

例如上面的结果会这样:

如果到22号,那么19号的会自动删除,生成22号的日志

2、通过文件大小设置备份并删除

使用RotatingFileHander对log的文件大小进行限制

import logging
from logging.handlers import RotatingFileHandler def init_log(data):
log_id = data.get("log_id", None)
logger = logging.getLogger(str(log_id))
logger.setLevel(logging.INFO) if not logger.handlers:
# 创建一个由文件大小控制的文件操作符
# 文件大小最大为1MB,超过时自动备份,最多备份3个,超过三个删除最早的记录
tfh = RotatingFileHandler(filename='mylog.log', maxBytes=1024 * 1024, backupCount=3)
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s [line:%(lineno)d]')
tfh.setFormatter(fmt)
logger.addHandler(tfh) def write_log(data):
log_id = data.get("log_id", None)
logger = logging.getLogger(str(log_id))
# 在需要打印日志的地方,直接打印日志即可,上面的init_log已经实例化完毕
logger.error("错啦!")

结果如下:

最多产生3个备份文件,每个文件最大为1MB,3个文件都超过1MB时,自动清理最早的日志。

logging日志的使用和设置过期自动删除的更多相关文章

  1. MongoDB中设置expire过期自动删除

    关键词: expireAfterSeconds.TTL TTL Time to Live 类似Redis中的expire机制,MongoDB也可以设置过期自动删除的表. MongoDB的过期设置依赖索 ...

  2. 对mysqlbinlog日志进行操作的总结包括 启用,过期自动删除

    操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs  产生一个新的binl ...

  3. Windows平台使用RMAN命令自动删除Oracle过期归档日志的方法

    自动删除Oracle过期归档日志的思路如下: 1.编写自动执行的bat脚本文件: 2.Windows设置定期执行计划 OracleArchLogClear.bat D:/Oracle/product/ ...

  4. Mysql设置binlog过期时间并自动删除

    问题: Mysql数据库由于业务原因,数据量增长迅速,binlog日志会增加较多,占用大部分磁盘空间. 解决方案: 出于节约空间考虑,可进行删除多余binary日志,并设置定期删除操作. .查看bin ...

  5. log4j2 自动删除过期日志文件配置及实现原理解析

    日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...

  6. apache日志配置一例,包括指定存储目录与格式、自动删除过期的日志文件

    有需要的朋友可以参考下(http://www.nanke0834.com) 1.vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 添加或修改为:复 ...

  7. python 自动化之路 logging日志模块

    logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...

  8. form,ajax注册,logging日志使用

    一.form表单类型提交注册信息 二.ajax版本提交注册信息 <!DOCTYPE html> <html lang="en"> <head> ...

  9. 【转】python模块分析之logging日志(四)

    [转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...

随机推荐

  1. 手工数据结构系列-C语言模拟队列 hdu1276

    #include <stdio.h> #include <stdlib.h> #define init_size 1000 typedef struct { int head, ...

  2. sql-libs(5)

    直接只用floor报错注入  或者 update即可

  3. MAC地址分类

    网卡MAC地址作为互联网设备在以太网中身份的唯一标识在以太网通讯中的作用比IP地址还要重要,MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique i ...

  4. 记一次FreeRTOS错误配置导致无法进入临界区

    最近项目用到FreeRTOS,在实际调试中发现我自己的一段代码本来好用的(在无RTOS的情况下),但是当我在带RTOS的情况下把代码放到一个单独的任务中运行时我发现本来好用的代码莫名其妙的出现问题,有 ...

  5. vuepress & package.json lock version

    vuepress & package.json lock version npm 锁版 bug npm lock version holy shit { "name": & ...

  6. How to enable HTTPS for local development in macOS using Chrome

    How to enable HTTPS for local development in macOS using Chrome HTTPS, macOS, Chrome local HTTPS htt ...

  7. css skeleton loading & skeleton components

    css skeleton loading css & :empty See the Pen Skeleton Screen with CSS by xgqfrms (@xgqfrms) on ...

  8. post upload file & application/x-www-form-urlencoded & multipart/form-data

    post upload file application/x-www-form-urlencoded & multipart/form-data https://stackoverflow.c ...

  9. 闲着蛋疼看下a++的过程

    赋值过程 int a = 1; int b = a++; x86 反汇编: int a = 1; 00D06428 C7 45 F8 01 00 00 00 mov dword ptr [a],1 i ...

  10. 破除区块链支付壁垒,NGK支付架构方案浮出水面

    什么叫做区块链支付?区块链支付系统与传统支付系统有哪些不同?简要地说,原来传统的支付系统是有一个类似于银行的中间平台存在的,用户们的支付交易第一时间是寄存在平台,由平台核实验证交易行为之后,方才放行交 ...