一、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. 操作系统 part3

    1.操作系统四特性 并发:一个时间段,多个进程在宏观上同时运行 共享:系统中的资源可以被多个并发进程共同使用(互斥共享,同时共享) 虚拟:利用多道程序设计,利用时分复用(分时系统)和空分复用(虚拟内存 ...

  2. sql-libs(1) -字符型注入

    关于sql-libs的安装就不做过多的说明, 环境:win7虚拟机 192.168.48.130(NAT连接),然后用我的win10物理机去访问. 直接加 ' 报错,后测试 and '1'='1 成功 ...

  3. Lua 从入门到放弃

    Lua 从入门到放弃 What is Lua? Lua is a powerful, efficient, lightweight, embeddable scripting language. It ...

  4. Promise nested then execute order All In One

    Promise nested then execute order All In One Promise nested then nested Promise not return new Promi ...

  5. vue-parent-child-lifecycle-order

    vue-parent-child-lifecycle-order vue parent child lifecycle order live demo https://99kyx.csb.app/ h ...

  6. Virtual Reality In Action

    Virtual Reality In Action VR WebXR immersive 沉浸式 https://github.com/immersive-web/webxr https://imme ...

  7. how to remove git commit history

    how to remove git commit history 如何删除 GitHub 仓库的历史数据 git filter-branch remove GitHub git commit hist ...

  8. Android Studio show whitespace & Android studio 设置注释缩进

    Android Studio show whitespace & Android studio 设置注释缩进 https://github.com/xgqfrms/flutter/issues ...

  9. 用Qt写了个将视频设置为壁纸的软件

    软件功能很简单,使用时占用的资源和播放的视频有关: 依赖于FFplay,Github源码 效果图:

  10. java放射机制的学习心得

    概述 之前在了解Spring的类加载机制的时候,了解了java的反射机制.但是,我对反射理解一直不深.也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什 ...