Python日志采集代码详解

目录
  • 一,日志概述
    • 1,日志作用
    • 2,日志级别
    • 3,日志格式
    • 4,日志位置
  • 二,logging模块
    • 1,简介
    • 2,文档
  • 三,logging第一种使用方法:简单配置使用
    • 1,使用方法
    • 2,basicConfig()部分参数说明
    • 3,示例1:日志打印至控制台
    • 4,示例2:日志保存至文件
  • 四,logging的第二种使用方式:日志流处理流程
    • 1,logging四大组件介绍
    • 2,Logger 记录器
    • 3,Handler 处理器
      • 3.1,StreamHandler
      • 3.2,FileHandler
    • 4,Filter 过滤器
    • 5,Formatter 格式化器
    • 6,使用示例:将日志输出至控制台,同时保存至文件
  • 五,logging 实战
    • 1,测试场景
    • 2,简单配置代码示例
    • 3,抛出问题
    • 4,解决思路
    • 5,思路1:使用python代码实现日志配置示例
    • 6,思路2:日志格式配置示例
      • 6.1,logger.conf文件
      • 6.2,读取配置文件,创建日志记录器logger
      • 6.3,调用示例
    • 7,总结

通常在前期调试代码的时候,我们会使用print在IDE控制台打印一些信息,判断运行情况。但在运行整个自动化测试项目的过程中,通过print打印信息的方式获取运行情况显然行不通。
这时就需要收集日志,每次运行后通过查看日志来获取项目运行情况。那么我们该如何获取日志?

一,日志概述

1,日志作用

在项目开发或测试过程中,项目运行一旦出现问题,记录日志信息就显得尤为重要。主要通过日志来定位问题,就好比侦探人员要根据现场留下的线索来推断案情。

2,日志级别

  • 代码在运行的过程中会出现不同的情况,如调试信息、警告信息、报错等,那么采集日志时就需要对这些日志区分级别管理,这样才能更精确地定位问题。日志级别一般分类如下(以严重程度递增排序):

级别


何时使用

DEBUG 调试信息,也是最详细的日志信息
INFO 证明事情按预期工作
WARNING 表明发生了一些意外,或不久的将来会发生问题(如 磁盘满了),软件还是正常工作
ERROR 由于更严重的问题,软件已经不能执行一些工作了
CRITICAL 严重错误,表明软件已经不能继续运行了
  • 日志级别排序为:CRITICAL > ERROR > WARNING > INFO > DEBUG

日志采集时设置低级别的日志,能采集到更高级别的日志,但不能采集到更低级别的日志。

例如:设置的日志级别为info级别,就只能采集到info、warning、error、critical级别的日志,不能采集到debug级别的日志。设置的日志级别为debug级别的话则能采集到所有级别的日志。默认设置级别为WARNING。

  • 在自动化测试项目中,通常在一般情况时使用info日志,预计报错则使用error日志。

3,日志格式

将日志格式化是为了提高日志的可阅读性,比如:时间+模块+行数+日志级别+日志具体信息的日志格式。如果输出的日志信息杂乱无章,就不利于问题的定位。如下所示就是日志格式化输出,非常便于阅读查看。

2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG this is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO this is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING this is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR this is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL this is critical message.

4,日志位置

通常,在一个项目中会有很多的日志采集点,日志采集点的设置必须结合业务来确定。

比如在执行修改登录密码用例前插入“开始执行修改登录密码用例...”的日志信息。再比如在登录代码执行前可以插入“准备登录...”日志信息。

如果在登录完成后,再设置登录的提示日志就会给人造成误解,无法判断到底是登录之前的问题还是登录之后的问题,因此日志采集点的位置很重要。

二,logging模块

1,简介

logging为python自带的日志模块,提供了通用的日志系统,包括不同的日志级别。logging可使用不同的方式记录日志,如使用文件,HTTP GET/POST,SMTP,Socket等方式记录。通常情况下,我们使用文件记录日志信息,文件格式一般为.txt或.log文件。

2,文档

详细内容可查看logging模块官方文档,使用时需要导入:

import logging

三,logging第一种使用方法:简单配置使用

1,使用方法

logging.basicConfig(**kwargs)

2,basicConfig()部分参数说明

filename指定日志名称或完整路径,如:E:/app-ui-autotest/log/log.txt

filemode指定打开文件的模式(如果文件打开模式未指定,则默认为'a')

常见的文件读写方式:

  • w 以写的方式打开
  • W 清空后写入(文件已存在)
  • r 以读的方式打开
  • a 以追加模式打开(即在文件原有的数据后面添加)

format指定日志输出格式

level将根记录器级别设置为指定级别

3,示例1:日志打印至控制台

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
import logging
logging.basicConfig(filename='./log.txt', level=logging.DEBUG,
                  format='%(asctime)s %(filename)s[line:%(lineno)d]
                   %(levelname)s %(message)s')
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

控制台输出结果:

2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG This is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.

4,示例2:日志保存至文件

logging.basicConfig(filename='log.txt', level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

输出格式:

2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.

注意:

  • 相较于控制台打印日志,文件保存日志的区别在于basicConfig()方法中加入了filename参数(即文件的完整路径)。
  • 保存日志至文件示例中,因为参数level=logging.INFO,所以DEBUG级别的日志未输出

四,logging的第二种使用方式:日志流处理流程

1,logging四大组件介绍

logging模块包括Logger,Handler,Filter,Formatter四个部分。

  • Logger 记录器,用于设置日志采集。
  • Handler 处理器,将日志记录发送至合适的路径。
  • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter 格式化器,指明了最终输出中日志的格式。

2,Logger 记录器

使用日志流采集日志时,须先创建Logger实例,即创建一个记录器(如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别WARNING,Handler和Formatter),然后做以下三件事:

  • 为程序提供记录日志的接口
  • 根据过滤器设置的级别对日志进行过滤
  • 将过滤后的日志根据级别分发给不同handler

3,Handler 处理器

Handler处理器作用是,将日志记录发送至合适的路径。如发送至文件或控制台,此时需要使用两个处理器,用于输出控制台的处理器,另一个是用于输出文件的处理器。通过 addHandler() 方法添加处理器 。常用的处理器类型有以下两种:

3.1,StreamHandler

  • 将日志信息发送至sys.stdout、sys.stderr或任何类似文件流对象,如在Pycharm IDE上显示的日志信息。
  • 构造函数为:StreamHandler(strm)。参数strm是一个文件对象,默认是sys.stderr。

3.2,FileHandler

  • 将日志记录输出发送至磁盘文件。 它继承了StreamHandler的输出功能,不过FileHandler会帮你打开这个文件,用于向一个文件输出日志信息。
  • 构造函数为:FileHandler(filename, mode)。参数filename为文件名(文件完整路径),参数mode为文件打开方式,默认为'a'即在文末追加。

自动化测试使用这两种类型就够了,其他还有RotatingFileHandler、TimedRotatingFileHandler、NullHandler等处理器,有兴趣可以查找资料了解。

4,Filter 过滤器

顾名思义是用于过滤,Handlers 与 Loggers 使用 Filters 可以完成比级别更复杂的过滤。不多做介绍,有兴趣可以查找资料了解。

5,Formatter 格式化器

Formatter用于设置日志的格式与内容,默认的时间格式为%Y-%m-%d %H:%M:%S,更多格式如下:


格式


描述

%(levelno)s 打印日志级别的数值
%(levelname)s 打印日志级别的名称
%(pathname)s 打印当前执行程序的路径
%(filename)s 打印当前执行程序的名称
%(funcName)s 打印日志的当前函数
%(lineno)d 打印日志的当前行号
%(asctime)s 打印日志的时间
%(thread)d 打印线程ID
%(threadName)s 打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息

6,使用示例:将日志输出至控制台,同时保存至文件

根据logging的模块化来编写代码,思路参考如下。

目录结构

logging_test.py

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
import logging
# 第一步,创建日志记录器
# 1,创建一个日志记录器logger
logger = logging.getLogger()
# 2,设置日志记录器的日志级别,这里的日志级别是日志记录器能记录到的最低级别,区别于后面Handler里setLevel的日志级别
logger.setLevel(logging.DEBUG)
# 第二步,创建日志处理器Handler。这里创建一个Handler,用于将日志写入文件
# 3,创建一个Handler,用于写入日志文件,日志文件的路径自行定义
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
# 4,设置保存至文件的日志等级
fh.setLevel(logging.INFO)
# 第三步,定义Handler的输出格式
# 5,日志输出格式定义如下
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 6,设置 写入日志文件的Handler 的日志格式
fh.setFormatter(format)
# 第四步,将Handler添加至日志记录器logger里
logger.addHandler(fh)
# 同样的,创建一个Handler用于控制台输出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)
# 输出日志
logger.info("This is info message")
logger.warning("This is warning message")
logger.error("This is error message")
logger.critical("This is critical message")

Pycharm运行logging_test.py模块,log.txt以及Pycharm控制台得到如下结果:

2020-10-07 15:54:04,752 test.py[line:3] INFO This is info message
2020-10-07 15:54:04,752 test.py[line:4] WARNING This is warning message
2020-10-07 15:54:04,752 test.py[line:5] ERROR This is error message
2020-10-07 15:54:04,752 test.py[line:6] CRITICAL This is critical message

五,logging 实战

1,测试场景

给登录今日头条app的操作添加日志采集。

2,简单配置代码示例

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
import logging
from appium import webdriver
logging.basicConfig(filename='./testLog.log', level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logging.info("启动今日头条APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver
def login_opera(driver):
    '''登录今日头条操作'''
    logging.info("开始登陆今日头条APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 点击【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 点击权限管理-确定按钮
        driver.find_element_by_xpath("//android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 点击未登录
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登录页点击登录按钮
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登录页点击“。。。”
        driver.find_element_by_xpath("//android.widget.LinearLayout[@index=4]").click() # 选择密码登录
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 输入账号
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 输入密码
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 点击登录
    except Exception as e:
        logging.error("登录错误,原因为:{}".format(e))
    else:
        logging.info("登陆成功...")
driver = android_driver()
login_opera(driver)

登录成功则日志输出如下:

2020-09-30 18:20:05,119 logging_test.py[line:21] INFO 启动今日头条APP...
2020-09-30 18:20:10,119 logging_test.py[line:27] INFO 开始登陆今日头条APP...
2020-09-30 18:21:07,120 logging_test.py[line:41] INFO 登陆成功...

3,抛出问题

上面示例代码成功地获取了日志信息,但这种写法只能作用于当前模块。而一个自动化测试项目往往有多个模块,如果在每个需要获取日志的模块都使用这样的方式,显然是不方便维护的。那么我们需要怎么解决呢?

4,解决思路

使用日志流处理流程。提供以下两种思路:

思路1:使用python代码实现日志配置。先创建日志记录器,并设置好Handler与日志格式,如上面的logging_test.py模块构造logger,其他模块采集日志时直接调用。

思路2:将日志的格式、输出路径等参数抽离出来放置在专门的配置文件里,如logging.conf,使用专门的模块处理,使用时直接在模块调用即可。

5,思路1:使用python代码实现日志配置示例

目录结构

test.py中需要采集日志时,从logging_test.py导入logger即可。也可以将logging_test.py里的代码进行进一步的封装,再调用,这里仅仅只是示例。
logging_test.py

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
import logging
# 创建日志记录器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 设置日志输出格式
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 创建一个Handler用于将日志写入文件
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
fh.setLevel(logging.INFO)
fh.setFormatter(format)
logger.addHandler(fh)
# 同样的,创建一个Handler用于控制台输出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)

test.py

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
from appium import webdriver
from log.logging_test import logger
def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logger.info("启动今日头条APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver
def login_opera(driver):
    '''登录今日头条操作'''
    logger.info("开始登陆今日头条APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 点击【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 点击权限管理-确定按钮
        driver.find_element_by_xpath("//android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 点击未登录
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登录页点击登录按钮
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登录页点击“。。。”
        driver.find_element_by_xpath("//android.widget.LinearLayout[@index=4]").click() # 选择密码登录
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 输入账号
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 输入密码
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 点击登录
    except Exception as e:
        logger.error("登录错误,原因为:{}".format(e))
    else:
        logger.info("登陆成功...")
driver = android_driver()
login_opera(driver)

运行test.py,结果如下:

2020-10-07 18:45:05,119 logging_test.py[line:21] INFO 启动今日头条APP...
2020-10-07 18:45:11,119 logging_test.py[line:27] INFO 开始登陆今日头条APP...
2020-10-07 18:45:20,120 logging_test.py[line:41] INFO 登陆成功...

6,思路2:日志格式配置示例

6.1,logger.conf文件

[loggers]   # loggers日志器对象列表,必须包含
keys=root, exampleLogger    # 一定要包含root这个值,当使用无参函数logging.getLogger()时,默认返回root这个logger,其他自定义logger可以通过logging.getLogger("exampleLogger")方式进行调用
[handlers] # handlers处理器对象列表,必须包含
keys=consoleHandler, fileHandler    # 定义声明handlers信息
[formatters] # formatters格式对象列表,必须包含
keys=form01,form02
[logger_root] # 对loggers中声明的logger进行逐个配置,且要一一对应,在所有的logger中,必须制定lebel和handlers这两个选项。对于非roothandler,还需要添加一些额外的option,如qualname、propagate等。handlers可以指定多个,中间用逗号隔开,比如handlers=fileHandler,consoleHandler,同时制定使用控制台和文件输出日志
level=DEBUG
handlers=consoleHandler, fileHandler
[logger_exampleLogger]  # 配置日志处理器exampleLogger:设置日志级别、日志输出指定的处理器配置文件,如consoleHandler,fileHandler
level=DEBUG
handlers=consoleHandler, fileHandler
qualname=exampleLogger  # qualname 表示它在logger层级中的名字,在应用代码中通过这个名字制定所使用的handler
propagate=0 # 可选项,其默认是为1,表示消息将会传递给高层次logger的handler
[handler_consoleHandler]    # 日志处理器consoleHandler的配置文件
class=StreamHandler   # 定控制台输出。将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象
level=DEBUG   # 日志级别
formatter=form01    # 输出格式
args=(sys.stdout,)
[handler_fileHandler]   # 日志处理器fileHandler的配置文件
class=FileHandler    # 将日志输出至磁盘文件
level=DEBUG # 日志级别
formatter=form02    # 输出格式
args=('./log.txt', 'a', 'UTF-8') # 参数如未设置绝对路径,则默认生成在执行文件log.py的工作目录。指定日志文件的打开模式,默认为'a'
[formatter_form01]  # 格式配置1
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]  # 格式配置2
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

注意:

  • 为了说明配置结构,这里的配置文件 logger.conf 里加了中文注释,实际使用时需要将注释去掉或改写成英文注释,否则会报编码错误。
  • 配置文件中包含三大主要模块:loggers,handlers,formatters。这三个主要模块包含的内容都是通过keys进行指定,然后通过logger_key、handler_key、formatter_key对里面的key进行具体的设置。
  • 配置handlers中的handler_consoleHandler的参数:指定日志输出到控制台、级别、输出格式、参数。
  • 配置handlers中的handler_fileHandlers的参数:指定将日志输出至磁盘文件、设置日志级别、输出格式、参数等。
  • 配置日志输出格式formatter_xxx,可配置多个,如:form01,form02。

6.2,读取配置文件,创建日志记录器logger

baseLog.py

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
import logging.config
CON_LOG='./logger.conf' # 配置文件路径
logging.config.fileConfig(CON_LOG)  # '读取日志配置文件'
logger = logging.getLogger('exampleLogger') # 创建一个日志器logger

6.3,调用示例

目录结构如下

test.py

# -*- coding:utf-8 -*-
# @author: 给你一页白纸
from appium import webdriver
from log.baseLog import logger
def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logger.info("启动今日头条APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver
def login_opera(driver):
    '''登录今日头条操作'''
    logger.info("开始登陆今日头条APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 点击【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 点击权限管理-确定按钮
        driver.find_element_by_xpath("//android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 点击未登录
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登录页点击登录按钮
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登录页点击“。。。”
        driver.find_element_by_xpath("//android.widget.LinearLayout[@index=4]").click() # 选择密码登录
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 输入账号
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 输入密码
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 点击登录
    except Exception as e:
        logger.error("登录错误,原因为:{}".format(e))
    else:
        logger.info("登陆成功...")
driver = android_driver()
login_opera(driver)

控制台、log.txt输出结果如下:

2020-10-07 19:30:35,119 logging_test.py[line:21] INFO 启动今日头条APP...
2020-10-07 19:30:40,119 logging_test.py[line:27] INFO 开始登陆今日头条APP...
2020-10-07 19:31:12,120 logging_test.py[line:41] INFO 登陆成功...

7,总结

在实际使用python做自动化测试过程中两种解决思路都可以使用,且都挺方便。其中对于思路1,还可以将代码进行更进一步的封装。

到此这篇关于Python日志采集(详细)的文章就介绍到这了,更多相关Python日志采集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python日志模块loguru详解

    目录 前言 使用步骤 安装库 简单使用方法 配置 异常追溯 总结 前言 在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会才用日志的方式来进行记录这些信息.python内置的logging标准库博主是没用过,今天给大家介绍loguru,loguru 库的使用可以说是十分简单,希望通过本文大家再也不用通过print来排查代码了. 使用步骤 安装库 pip install loguru 简单使用方法 from loguru import logger logge

  • python logging多进程多线程输出到同一个日志文件的实战案例

    参考官方案例:https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.html import logging import logging.config import logging.handlers from multiprocessing import Process, Queue import random import threading import time def logger_thread(q): while True:

  • Python实现日志实时监测的示例详解

    目录 介绍 观察者模式类图 观察者模式示例 1.创建订阅者类 2.创建发布者类 3.应用客户端-Map_server_client.py 4.测试 介绍 观察者模式:是一种行为型设计模式.主要关注的是对象的责任,允许你定义一种订阅机制,可在对象事件发生时通知多个"观察"该对象的其他对象.用来处理对象之间彼此交互. 观察者模式也叫发布-订阅模式,定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新. 观察者设计模式是最简单的行为模式之一

  • Python中的logging模块实现日志打印

    目录 方法1:配置并输出日志到标准输出 方法2:配置输出到日志文件 前言: 大家在写代码的时候,经常会使用print打印日志方便排查问题,然而print的问题就是太过简单,缺少时间.日志级别等格式化信息. Python自带的logging模块,很简单就能实现日志的配置和打印,它有两种用法,方法1是把日志输出到标准输出,其实就是命令行界面,方法2则是输出日志到文件,更加方便. 方法1:配置并输出日志到标准输出 import logging   LOG_FORMAT = "%(asctime)s -

  • Python学习之日志模块详解

    目录 日志的作用 日志的等级 logging 模块的使用 logging 模块演示小案例 OK,今天我们来学习一下 python 中的日志模块,日志模块也是我们日后的开发工作中使用率很高的模块之一,接下来们就看一看今天具体要学习日志模块中的那些内容吧. 日志的作用 说到日志,我们完全可以想象为现实生活中的日记.日记是我们平时记录我们生活中点点滴滴的一种方法,而日志我们可以认为是 程序的日记 ,程序的日记是用来记录程序的行为,一般来说我们可以通过日志记录一些程序的重要信息. 比如哪里报错了?报错原

  • 详解 python logging日志模块

    目录 1.日志简介 2.日志级别 3.修改日志级别 4.日志记录到文件 5.指定日志格式 6.记录器(logger) 7.处理器(Handler) 8.处理器操作 9.格式器(formatter) 10.logging.basicConfig 11.日志配置 转自微信公众号: Python之禅 1.日志简介 说到日志,无论是写框架代码还是业务代码,都离不开日志的记录,他能给我们定位问题带来极大的帮助. 记录日志最简单的方法就是在你想要记录的地方加上一句 print , 我相信无论是新手还是老鸟都

  • Python日志采集代码详解

    目录 一,日志概述 1,日志作用 2,日志级别 3,日志格式 4,日志位置 二,logging模块 1,简介 2,文档 三,logging第一种使用方法:简单配置使用 1,使用方法 2,basicConfig()部分参数说明 3,示例1:日志打印至控制台 4,示例2:日志保存至文件 四,logging的第二种使用方式:日志流处理流程 1,logging四大组件介绍 2,Logger 记录器 3,Handler 处理器 3.1,StreamHandler 3.2,FileHandler 4,Fil

  • Python实现调度算法代码详解

    调度算法 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源. 在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法:又如在分时系统中,为了保证系统具有合理

  • Python模块文件结构代码详解

    本文研究的主要是Python模块文件结构的相关内容,具体如下. Python文件结构 文件结构(范例全文) #/usr/bin/env python "this is a test module" import sys import os debug = True class FooClass (object): "Foo class" pass def test(): "test function" foo = FooClass() if de

  • Python 分形算法代码详解

    目录 1. 前言 什么是分形算法? 2. 分形算法 2.1 科赫雪花 2.2 康托三分集 2.3 谢尔宾斯基三角形 2.4 分形树 3. 总结 1. 前言 分形几何是几何数学中的一个分支,也称大自然几何学,由著名数学家本华曼德勃罗( 法语:BenoitB.Mandelbrot)在 1975 年构思和发展出来的一种新的几何学. 分形几何是对大自然中微观与宏观和谐统一之美的发现,分形几何最大的特点: 整体与局部的相似性: 一个完整的图形是由诸多相似的微图形组成,而整体图形又是微图形的放大. 局部是整

  • Python装饰器代码详解

    目录 一.理解装饰器 二.装饰器原型 1.不带参数的装饰器 2.带参数的被装饰的函数 3.带参数的装饰器 4.使用类作为装饰器 5.使用对象作为装饰器 6.多层装饰器的嵌套 总结 一.理解装饰器 所有东西都是对象(函数可以当做对象传递) 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. def function_one(): print("测试函数") #可以将一个函数赋值给一个变量,比如 foo =function_one #这里没有在使用小括号,因

  • python logging日志模块的详解

    python logging日志模块的详解 日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如.磁盘空间低").这个软件还能按预期工作. ERROR:更严重的问题,软件没能执行一些功能 CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行 这5个等级,也

  • python scrapy重复执行实现代码详解

    这篇文章主要介绍了python scrapy重复执行实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取 Scrapy模块: 1.scheduler:用来存放url队列 2.downloader:发送请求 3.spiders:提取数据和url 4.itemPipeline:数据保存 from twisted.internet i

  • Python中logging日志库实例详解

    logging的简单使用 用作记录日志,默认分为六种日志级别(括号为级别对应的数值) NOTSET(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40) CRITICAL(50) special 在自定义日志级别时注意不要和默认的日志级别数值相同 logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO.WARNING.ERROR.CRITICAL 级别的日志都会输出. |2logging常见对象 Logger:日志,

  • Python中更优雅的日志记录方案详解

    目录 常见使用 loguru 安装 基本使用 详细使用 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter 来进行一些处理,比如把日志输出到不同的位置,或者设置一个不同的输出格式,或者设置日志分块和备份.但其实个人感觉 logging 用起来其实并不是那么好用,其实主要还是配置较为繁琐. 常见使用 首先看看 logging 常见的解决方案吧,我一般会配置输出到文件.控制台和

随机推荐