• Python 日志模块详解


    前言

    我们知道查看日志是开发人员日常获取信息、排查异常、发现问题的最好途径,日志记录中通常会标记有异常产生的原因、发生时间、具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率。所以在程序里边加入日志模块很有必要。

    日志分类

    我们可以按照输出终端进行分类,也可以按照日志级别进行分类。输出终端指的是将日志在控制台输出显示和将日志存入文件;日志级别指的是 Debug、Info、WARNING、ERROR以及CRITICAL等严重等级进行划分。

    Python 的 logging

    logging提供了一组便利的日志函数,它们分别是:debug()、 info()、 warning()、 error() 和 critical()。logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):

    日志输出

    • 输出到控制台

      使用 logging 在控制台打印日志,这里我们用 Pycharm 编辑器来观察:

    • 保存为.txt文件

      依旧是强大的 basicConfig

      logging.basicConfig(level=logging.DEBUG, filename='coder.log', filemode='a')   # 配置中填写 filename (指定文件名) 和 filemode (文件写入方式)

    Logging的四大组件的简单的介绍

    在实际的工作或应用中,我们或许还需要指定文件存放路径、用随机数作为日志文件名、显示具体的信息输出代码行数、日志信息输出日期和日志写入方式等内容。再构思一下:

    具体代码:

    import os
    import logging
    import uuid
    from logging import Handler, FileHandler, StreamHandler
    ​
    ​
    class PathFileHandler(FileHandler):
        def __init__(self, path, filename, mode='a', encoding=None, delay=False):
    ​
            filename = os.fspath(filename)
            if not os.path.exists(path):
                os.mkdir(path)
            self.baseFilename = os.path.join(path, filename)
            self.mode = mode
            self.encoding = encoding
            self.delay = delay
            if delay:
                Handler.__init__(self)
                self.stream = None
            else:
                StreamHandler.__init__(self, self._open())
    ​
    ​
    class Loggers(object):
        # 日志级别关系映射
        level_relations = {
            'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING,
            'error': logging.ERROR, 'critical': logging.CRITICAL
        }
    ​
        def __init__(self, filename='{uid}.log'.format(uid=uuid.uuid4()), level='info', log_dir='log',
                     fmt='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
            self.logger = logging.getLogger(filename)
            abspath = os.path.dirname(os.path.abspath(__file__))
            self.directory = os.path.join(abspath, log_dir)
            format_str = logging.Formatter(fmt)  # 设置日志格式
            self.logger.setLevel(self.level_relations.get(level))  # 设置日志级别
            stream_handler = logging.StreamHandler()  # 往屏幕上输出
            stream_handler.setFormatter(format_str)
            file_handler = PathFileHandler(path=self.directory, filename=filename, mode='a')
            file_handler.setFormatter(format_str)
            self.logger.addHandler(stream_handler)
            self.logger.addHandler(file_handler)
    ​
    ​
    if __name__ == "__main__":
        txt = "谢谢关注玩转机器学习的博客园"
        log = Loggers(level='debug')
        log.logger.info(4)
        log.logger.info(5)
        log.logger.info(txt)
     

    参考链接:http://blog.itpub.net/31557738/viewspace-2220741/

  • 相关阅读:
    sqlserver2005分页
    windows计划任务
    sqlserver 2005 通信格式
    sqlserver 导出数据到excel
    所有连接sqlserver 2005 数据库的驱动程序
    Sql 2000 中行转列的查询方法
    [转] ASP.NET中使用javascript
    [转]17种常用正则表达式
    正则式正反向预编译(实战)
    正则表达式的正反向预编译
  • 原文地址:https://www.cnblogs.com/shierlou-123/p/11288011.html
Copyright © 2020-2023  润新知