【python】logging日志实时打印到控制台+输出到文件【总结篇】

一、日志:

        日志跟踪运行软件所发生事件的方法;
        日志的作用:信息查询、服务诊断、数据分析

        1.日志等级

    debug:  调试信息
    info:       描述重要事件
    warning:警告信息
    error:     报错异常信息
    critical:   严重错误 

        2.python中如何生成日志:logging模块

logging模块是python的内置模块:可以生成日志,包括可以设置日志等级、日志路径、日志文件回滚等)

        3.logging和print的区别:

print :会输出到标准输出流中,格式为字符串格式

logging 模块:更加灵活

        1)可以设置输出到任意位置,如写入文件、写入远程服务器等

        2)设置日志等级,在不同的版本(如开发环境、生产环境)上通过设置不同的输出等级来记录对应的日志

        3)具有灵活的配置和格式化功能,如配置输出当前模块信息、运行时间等,相比 print 的字符串格式化更加方便易用。可以在 logging 模块中非常灵活。

        4.logging模块包括4个组件:

1)logger 日志器,提供了应用程序的接口
2)Handler 处理器,通过logger在不同位置输出日志
3)Formator 格式器,决定日志以什么样的格式显示
4)Filter 过滤器,过滤哪些需要记录输出,哪些需要丢弃

—–一个日志器,可以对应多个处理器;每个处理器可以有单独的格式器。 

         5.Formatter函数各参数:

 可以指定日志的输出格式format,这个参数可以输出很多有用的信息

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.WARNING---需要用大写
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,
        默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

二、代码: 

# Time:2022 2022/3/2 10:21
# Author: Jasmay
# -*- coding: utf-8 -*-
import logging

import time
import os

root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_dir = os.path.join(root_dir,"logs")

if not os.path.exists(log_dir):
    os.mkdir(log_dir)

class DemoLogger():
        def __init__(self):

            # 创建一个日志器
            self.logger = logging.getLogger("logger")

            # 设置日志输出的最低等级,低于当前等级则会被忽略
            self.logger.setLevel(logging.INFO)

            # 创建处理器:sh为控制台处理器,fh为文件处理器
            sh = logging.StreamHandler()

            # 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹
            # log_file = os.path.join(log_dir,"{}_log".format(time.strftime("%Y/%m/%d",time.localtime())))
            log_file = os.path.join(log_dir,"autotest.log")
            fh = logging.FileHandler(log_file,encoding="UTF-8")

            # 创建格式器,并将sh,fh设置对应的格式
            formator = logging.Formatter(fmt = "%(asctime)s %(filename)s %(levelname)s %(message)s",
                                         datefmt="%Y/%m/%d %X")
            sh.setFormatter(formator)
            fh.setFormatter(formator)

            # 将处理器,添加至日志器中
            self.logger.addHandler(sh)
            self.logger.addHandler(fh)



logprint = DemoLogger().logger
if __name__ == '__main__':
    logprint.debug("------这是debug信息---")
    logprint.info("------这是info信息---")
    logprint.warning("------这是warning信息---")
    logprint.error("------这是error信息---")
    logprint.critical("------这是critical信息---")


三、如何运用

# Time:2022 2022/3/2 10:21
# Author: Jasmay
# -*- coding: utf-8 -*-
import logging

import time
import os

root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_dir = os.path.join(root_dir,"logs")

if not os.path.exists(log_dir):
    os.mkdir(log_dir)

class DemoLogger():
        def log(self):

            # 创建一个日志器
            logger = logging.getLogger("logger")

            # 设置日志输出的最低等级,低于当前等级则会被忽略
            logger.setLevel(logging.INFO)

            # 创建处理器:sh为控制台处理器,fh为文件处理器
            sh = logging.StreamHandler()

            # 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹
            # log_file = os.path.join(log_dir,"{}_log".format(time.strftime("%Y/%m/%d",time.localtime())))
            log_file = os.path.join(log_dir,"autotest.log")
            fh = logging.FileHandler(log_file,encoding="UTF-8")

            # 创建格式器,并将sh,fh设置对应的格式
            formator = logging.Formatter(fmt = "%(asctime)s %(filename)s %(levelname)s %(message)s",
                                         datefmt="%Y/%m/%d %X")
            sh.setFormatter(formator)
            fh.setFormatter(formator)

            # 将处理器,添加至日志器中
            logger.addHandler(sh)
            logger.addHandler(fh)

            return logger


        def sum(self,a,b):
            try:
                sum = a+b
                self.log().info("{}+{}={}加法运算正确".format(a,b,sum))
                return sum
            except Exception as error:
                self.log().error("{}+{}加法运算计算错误".format(a,b,error))






result = DemoLogger().sum(2,"a")

if __name__ == '__main__':
    print(result)


来源:Jasmay

物联沃分享整理
物联沃-IOTWORD物联网 » 【python】logging日志实时打印到控制台+输出到文件【总结篇】

发表评论