一、logging的框架

1、 Loggers: 可供程序直接调用的接口,app通过调用提供的api来记录日志

2、 Handlers: 决定将日志记录分配至正确的目的地

3、 Filters:对日志信息进行过滤,提供更细粒度的日志是否输出的判断

4、 Formatters: 制定最终记录打印的格式布局

二、Log级别

系统默认有6个级别,优先级:

CRITICAL    50

ERROR      40

WARNING   30

INFO        20

DEBUG      10

NOTSET     0

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.WARNNING;

stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;

二、打印log日志到文件和屏幕的例子或者可以直接当成模块调用,文件名:debug_info.py

#!/usr/bin/env python
# coding=utf-8
# logging模块打印log日志到文件和屏幕
# Log级别:CRITICAL(50)、ERROR(40)、WARNING(30)、INFO(20)、DEBUG(10)、NOTSET(0)
# https://www.cnblogs.com/liujiacai/p/7804848.html
import logging,os,sys,timeclass Log_info(object):def __init__(self):# 指定日志文件名,获取当前执行的py文件名# 获取当天日期file_name_date = time.strftime("%Y-%m-%d", time.localtime())self.filename = str(os.path.basename(sys.argv[0]).split(".")[0]) + file_name_date + '.log'# 指定输出的格式和内容self.format = '%(asctime)s [%(filename)s] %(levelname)s:%(message)s'# 设置日志级别,默认为logging.WARNNING# self.level = logging.INFO# 和file函数意义相同,指定日志文件的打开模式,'w'或者'a'# self.filemode = 'a'# 指定时间格式self.datefmt = '%Y-%m-%d %H:%M:%S'self.logger = logging.getLogger(__name__)  # 创建日志记录器def main(self):# 这个方法只能保存到文件,不能同时输出到屏幕# logging.basicConfig(filename=self.filename,format=self.format,level=self.level#                     ,filemode=self.filemode,datefmt=self.datefmt)self.logger.setLevel(logging.INFO)  # 日志记录器的等级format = logging.Formatter(self.format,datefmt=self.datefmt)# 如果当前日志器里handler已存在就不重复添加,为空再添加,避免日志重复输出if not self.logger.handlers:# 日志输出到文件file_handler = logging.FileHandler(self.filename)file_handler.setLevel(logging.INFO)file_handler.setFormatter(format)# 使用StreamHandler输出到屏幕console = logging.StreamHandler()console.setLevel(logging.INFO)console.setFormatter(format)# 添加两个Handlerself.logger.addHandler(file_handler)self.logger.addHandler(console)# 执行输出信息: 2019-01-02 15:51:13 [print_debug.py] INFO:输出信息内容# self.logger.info("输出信息内容")# 注意不能这么写,类型不一致# self.logger.info("经营许可证字段值个数:", 2)# 这么写就可以# self.logger.info("经营许可证字段值个数:%s"%2)# self.logger.info("经营许可证字段值个数:%s",3)# try:#     (a== 2)# except Exception as e:#     self.logger.info(e)# 如果这样返回,那样调取的时候就不用每次写logger.info,直接写logger就可以了return self.logger.info
if __name__ =="__main__":log_info = Log_info()logger = log_info.main()

二、如何调用:

from debug_info import Log_infologger = Log_info().main()
logger("输出的例子")
# 2、3是int类型
logger("输出的例子:%s"%2)
logger("输出的例子:%s",3)
logger("输出的例子:%d",3)

优化:

# 非单例模式
def get_logs(folderName):"""封装日志打印输出到文件和控制台,folderName为日志存放的文件夹名"""logs_path = os.path.dirname(os.path.dirname(__file__)) + '/' + folderName + '/'if not os.path.exists(logs_path):print("未找到指定文件夹:%s,请核实!" % folderName)sys.exit()else:# 创建日志器,记录器名称通过__name__获取logger = logging.getLogger(__name__)# 设置日志器级别logger.setLevel(logging.INFO)# 如果当前日志器里处理器Handler已存在就不重复添加,为空再添加,避免日志重复输出if not logger.handlers:# 指定日志文件名为当前执行的py文件名filename = str(os.path.basename(sys.argv[0]).split(".")[0]) + '.log'# 指定输出的格式和内容fmt = '%(asctime)s [%(filename)s-(%(funcName)s:%(lineno)d)] %(levelname)s:%(message)s'# 指定日期格式datefmt = '%Y-%m-%d %H:%M:%S'# 设置格式器format = logging.Formatter(fmt, datefmt=datefmt)# 日志输出到文件,只保存到单一文件,容量会无限大,一般不用,采用时间节点分割file_handler = logging.FileHandler(logs_path + filename)# 日志输出到文件,依据时间切割到不同文件中,when以什么时间单位进行分割(秒、分钟、小时、天、午夜等),# interval间隔多久,backupCount保留文件数量,超过数量时间久远的自动被替换掉# 例如:以每一晚进行切割日志,保留30个文件# file_handler = logging.handlers.TimedRotatingFileHandler(logs_path + filename, when='midnight', interval=1, backupCount=30)file_handler.setLevel(logging.INFO)file_handler.setFormatter(format)# 只输出error级别的日志到文件,可以快速定位代码问题error_file_handler = logging.FileHandler(logs_path + 'error_' + filename)error_file_handler.setLevel(logging.ERROR)error_file_handler.setFormatter(format)# 使用StreamHandler输出到屏幕console = logging.StreamHandler()console.setLevel(logging.INFO)console.setFormatter(format)# 添加处理器Handlerlogger.addHandler(file_handler)logger.addHandler(error_file_handler)logger.addHandler(console)return logger

优化为单例模式,get_log.py:

#!/usr/bin/env python
# coding=utf-8
# logging模块打印log日志到文件和控制台
# Log级别:CRITICAL(50)、ERROR(40)、WARNING(30)、INFO(20)、DEBUG(10)、NOTSET(0)
# 四大组件:日志器(Logger)、处理器(Handler)、格式器(Formatter)、过滤器(Filter)
# 以下这种方式导入也可以使用logging,因为logging是包名,导入时会自动执行__init__文件
import logging.handlers
import os
import sysclass GetLog(object):"""单例模式封装日志打印输出到文件和控制台"""logger = None@classmethoddef get_log(cls, folderName):"""folderName为日志存放的文件夹名"""# logs_path = os.path.dirname(os.path.dirname(__file__)) + '/' + folderName + '/'logs_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), folderName + '/')if not os.path.exists(logs_path):print("ERROR:未找到指定文件夹:%s,请核实!" % folderName)sys.exit()else:if cls.logger is None:# 创建日志器,记录器名称通过__name__获取cls.logger = logging.getLogger(__name__)# 设置日志器级别cls.logger.setLevel(logging.INFO)# 指定日志文件名为当前执行的py文件名filename = str(os.path.basename(sys.argv[0]).split(".")[0]) + '.log'# 指定输出的格式和内容fmt = '%(asctime)s [%(filename)s-(%(funcName)s:%(lineno)d)] %(levelname)s:%(message)s'# 指定日期格式datefmt = '%Y-%m-%d %H:%M:%S'# 设置格式器format = logging.Formatter(fmt, datefmt=datefmt)# 日志输出到文件,只保存到单一文件,容量会无限大,一般不用,采用时间节点分割(运行时,即使没有日志输出结果,也会创建一个空的日志文件)file_handler = logging.FileHandler(logs_path + filename)# 日志输出到文件,依据时间切割到不同文件中,when以什么时间单位进行分割(秒、分钟、小时、天、午夜等)# interval间隔多久,backupCount保留文件数量,超过数量时间久远的自动被替换掉# 例如:以每一晚进行切割日志,保留30个文件# file_handler = logging.handlers.TimedRotatingFileHandler(logs_path + filename, when='midnight', interval=1, backupCount=30)file_handler.setLevel(logging.INFO)file_handler.setFormatter(format)# 只输出error级别的日志到文件,可以快速定位代码问题(运行时,即使没有日志输出结果,也会创建一个空的日志文件)# error_file_handler = logging.handlers.TimedRotatingFileHandler(logs_path + 'error_' + filename, when='midnight', interval=1, backupCount=30)# error_file_handler = logging.FileHandler(logs_path + 'error_' + filename)# error_file_handler.setLevel(logging.ERROR)# error_file_handler.setFormatter(format)# 使用StreamHandler输出到屏幕console = logging.StreamHandler()console.setLevel(logging.INFO)console.setFormatter(format)# 添加处理器Handler到日志器中cls.logger.addHandler(file_handler)# cls.logger.addHandler(error_file_handler)cls.logger.addHandler(console)return cls.loggerif __name__ == "__main__":logger = GetLog().get_log('logs')logger.info("经营许可证字段值个数:%s", 3)logger.info("经营许可证字段值个数:{}".format(333))logger.error("错误的日志。。。。")

python logging模块打印log日志到文件和屏幕相关推荐

  1. python logging模块打印并记录日志

    把需要的所有东西都封装在一个方法中: def init_log(save_path, mode='w'):import logginglogger = logging.getLogger() # 不加 ...

  2. python logging模块-写日志、log回滚

    python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...

  3. Python Logging模块实现运行的程序写入 日志

    参考文章:  Python使用logging模块实现打印log到指定文件的方法_python_脚本之家 https://www.jb51.net/article/146909.htm 步骤: (1) ...

  4. Python logging模块切分和轮转日志

    Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...

  5. python用logging模块写循环日志

    在程序运行的过程中需要打印一些有用的信息,但如果需要打印的信息比较多的话且运行时间较长则磁盘容量可能不够用. 因此就需要写循环日志. 比如设置日志的大小为3M,设置日志的个数为3个,设置日志名称为Lo ...

  6. python logging模块使用

    python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...

  7. python logging模块使用教程

    格式化配置: logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(filename)s [%(lin ...

  8. Python logging 模块的 dictConfig

    logging 模块的 dictConfig logging 模块配置 log 的方式 1. `logging.basicConfig()` 2. 自定义 `logger` 3. `logging.c ...

  9. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

最新文章

  1. [BZOJ4556][Tjoi2016Heoi2016]字符串 主席树+二分+倍增+后缀自动机
  2. 1080 两个数的平方和(数学)
  3. winform弹出唯一窗体的方法
  4. 27 款经典的CSS 框架
  5. 前端学习(3064):vue+element今日头条管理-状态管理
  6. ES6——let、const和var的用法和区别
  7. jquery $.post 超时_详解如何实现前端jquery中的ajax方法,看这一篇就够了
  8. linux系统防火墙白名单,linux系统防火墙如何结束白名单
  9. 升级qq群一直显示服务器失败怎么回事啊,QQ群创建失败是怎么回事,QQ群创建失败原因是什么...
  10. word批注怎么删除计算机名字,word批注删除不了,word怎么删除批注栏
  11. 插值多项式的龙格现象的介绍与模拟
  12. ubuntu14.04安装搜狗输入法
  13. 微信朋友圈公众号装B神器网站源码+可用于引流
  14. 哈工大深圳计算机学院复试分数线,哈尔滨工业大学深圳研究生院复试线:2011哈尔滨工业大学深圳研究生院复试分数线...
  15. 全球与中国代餐减肥食品市场深度研究分析报告
  16. 鸡兔同笼,兔子和鸡一共48只,有108只脚 兔子和鸡各有多少只?
  17. ORACLE--知识点②--函数
  18. java map key 升序_Java Map 按 key 升序排序
  19. 计算机基础选择题(2)
  20. 华为服务器修改root密码,修改root密码

热门文章

  1. behavior:expression((this.hideFocus=true) (this.behavior='none'));
  2. 橡皮筋画直线c 语言,canvas 橡皮筋式线条绘图应用方法
  3. C++可变参数模板显式特例化
  4. Java上传ZIP解压获取图片流
  5. bert简介_什么是BERT?
  6. 自己动手写类似酷狗播放器(4)_系统托盘的显示
  7. LDAP 服务器搭建
  8. android 创建平板电脑模拟器
  9. android教育系统_适用于学生的十大教育性Android应用程序
  10. 《深入解析ORACLE》学习笔记(3)---ORACLE中的DB_NAME,SERVICE_NAME,INSTANCE_NAME,ORACLE_SID,GLOBAL_DBNAME介绍