python---logging模块简单实用

**

1.日志记录整体框架

**
pythonlogging模块记录日志的整体框架如下图所示:
在这里插入图片描述
如图所示,整个日志记录的框架可以分为这么几个部分:

Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 Log Record。
Log Record:就代指生成的一条条日志记录。
Handler:即用来处理日志记录的类,它可以将 Log Record 输出到我们指定的日志位置和存储形式等,如我们可以指定将日志通过 FTP 协议记录到远程的服务器上,Handler 就会帮我们完成这些事情。
Formatter:实际上生成的 Log Record 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,那么这个过程就由 Formatter 来完成,返回的就是日志字符串,然后传回给 Handler 来处理。
Filter:另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过滤过程就交给 Filter 来完成。
Parent Handler:Handler 之间可以存在分层关系,以使得不同 Handler 之间共享相同功能的代码。
以上就是整个 logging 模块的基本架构和对象功能,了解了之后我们详细来了解一下 logging 模块的用法。

**

2.logger简单使用

**
logging.getlog(模块名称):声明一个log对象,参数为模块名称,使用__name__就是模块的名称,如果直接运行这个脚本的话就是 main,如果是 import 的模块的话就是被引入模块的名称,这个变量在不同的模块中的名字是不同的,所以一般使用 name 来表示就好了
logging.basicConfig():log的基础设置,其方法参数有如下

  • filename:即日志输出的文件名,如果指定了这个信息之后,实际上会启用 FileHandler,而不再是StreamHandler,这样日志信息便会输出到文件中了。
  • filemode:这个是指定日志文件的写入方式,有两种形式,一种是 w,一种是 a,分别代表清除后写入和追加写入。
  • format:指定日志信息的输出格式,部分参数格式如下:
    %(levelno)s:打印日志级别的数值。
    %(levelname)s:打印日志级别的名称。有INFO、DEBUG、WARNING等,打印lever及其以上等级的日志
    %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]。
    %(filename)s:打印当前执行程序名。
    %(funcName)s:打印日志的当前函数。
    %(lineno)d:打印日志的当前行号。
    %(asctime)s:打印日志的时间。
    %(thread)d:打印线程ID。
    %(threadName)s:打印线程名称。
    %(process)d:打印进程ID。
    %(processName)s:打印线程名称。
    %(module)s:打印模块名称。
    %(message)s:打印日志信息。
  • datefmt:指定时间的输出格式。
  • style:如果 format 参数指定了,这个参数就可以指定格式化时的占位符风格,如 %、{、$ 等。
  • level:指定日志输出的类别,程序会输出大于等于此级别的信息,有。
  • stream:在没有指定 filename 的时候会默认使用 StreamHandler,这时 stream 可以指定初始化的文件流。
  • handlers:可以指定日志处理时所使用的 Handlers,必须是可迭代的。
  • LEVER等级
    在这里插入图片描述
    3.Handler
    logging 模块提供的 Handler 有:
  • StreamHandler:logging.StreamHandler;日志输出到流,可以是 sys.stderr,sys.stdout 或者文件。
  • FileHandler:logging.FileHandler;日志输出到文件。
  • BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式。
  • RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚。
  • TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件。
  • SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets。
  • DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets。
  • SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址。
  • SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog。
  • NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志。
  • MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer。
  • HTTPHandler:logging.handlers.HTTPHandler;通过”GET”或者”POST”远程输出到HTTP服务器。

示例:

import os
import time
import logging
from fileRootPath import RootPath


class Log:
    def __init__(self):
        rootPath = RootPath().get_root_path()+"\\log"#获取.log文件的根目录
        print("rootpath:%s"%rootPath)
        # log文件地址:文件夹地址+年_月_日_时_分_秒.log
        self.logName = os.path.join(rootPath,"%s.log"%time.strftime('%Y-%m-%d %H:%M:%S'))
        self.logger = logging.getLogger(__name__)#定义一个loging对象
        self.logger.setLevel(logging.INFO) #设置logger等级为INFO

        '''设置logging的格式:发生时间-文件名称-文件行数-方法-log等级-信息'''
        self.formatter = logging.Formatter('[%(asctime)s]-%(filename)s[line::%(lineno)d]-fuc:%(funcName)s-%(levelname)s:%(message)s')

    def file_Haddle(self):
        '''日志输出到.log文件夹中'''
        file_haddle = logging.FileHandler(self.logName,'a') #以追加的方式将日志写到.log文件中
        file_haddle.setLevel(logging.INFO) #设置log等级
        file_haddle.setFormatter(self.formatter) #设置log格式模板
        self.logger.addFilter(file_haddle)

        '''日志输出到控制台'''
        # 创建一个streamhandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        if level == 'info':
            self.logger.info(message)
        elif level == 'debug':
            self.logger.debug(message)
        elif level == 'warning':
            self.logger.warning(message)
        elif level == 'error':
            self.logger.error(message)
        # 这两行代码是为了避免日志输出重复问题
        self.logger.removeHandler(ch)
        self.logger.removeHandler(file_haddle)
        file_haddle.close()

    def debug(self,message):
        self.__console('debug',message)

    def info(self,message):
        self.__console('info',message)

    def warning(self,message):
        self.__console('warning',message)

    def error(self,message):
        self.__console('error',message)


if __name__ == '__main__':
    lg = Log()
    rp  = lg.logName
    print(rp)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值