广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python Logging库HTTP
  • 699
分享到

Python Logging库HTTP

PythonLoggingHTTP 2023-01-31 08:01:16 699人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

python的logging库是标准库中用来实现日志的库,功能强大,而且使用起来也算是方便。该库提供了很多个不同的Handler,用来对日志进行不同的处理。例如FileHandler用来将日志记录到文件,RotateFileHandle

python的logging库是标准库中用来实现日志的库,功能强大,而且使用起来也算是方便。该库提供了很多个不同的Handler,用来对日志进行不同的处理。例如FileHandler用来将日志记录到文件,RotateFileHandler用来将日志记录到文件而且支持日志文件滚动备份,还有本文中所说的HttpHandler,可以将日志通过HTTP请求发送到服务器上。

使用Python的logging模块的过程大约有如下几个步骤:

  1. 根据配置文件、配置字典或者调用方法的方式初始化日志配置,并获取一个logger。

  2. 调用logger实例的如下方法来发出一条日志:critical, error, warning, info, debug。这些方法的定义如下,以info为例:

    logger.info(fmt, *args, exc_info, extra)
    

    P.S. 本文的目的不是说明logging如何使用,所以具体的用法请参考官方文档。

当logger对象调用info等方法发出一条日志时,他可以接受像C语言中的printf函数或者python3中的pritnf函数一样的前两个参数:格式化字符串和对应的参数列表,用来表示要发出的日志的内容。当logging模块真的要发出这条日志时,才会对字符串进行格式化,并且加入最终的日志字符串中。因此,在Python参考手册(第4版)中(19.7节,289页)有强调了如下这一点:发出日志消息时,应该避免在发出消息时带有字符串格式化的代码(即格式化一条消息,然后把结果传递到日志记录模块中)。原因是,直接传递格式化后的字符串会导致参数被完全求值,这个有可能是非必要的,会导致日志性能下降。举个例子:

正确方式:
logger.info("hello, %s", "myname")

错误方式:
logger.info("hello, %s" % "myname")

那么问题来了,如果一个logger的handler使用了HttpHandler,这个坑爹货居然不会在发出日志前对日志内容部分进行格式化,而是只发送了前面的fmt字符串到http服务器,结果就像下面这样:

WARNING Tue Jan 27 15:27:34 2015 admin.config 192.168.100.126 POST /user/login User [%s] logged in failed.
而我们期待的应该是:

WARNING Fri Jan 23 11:36:45 2015 admin.config 192.168.100.126 POST /user/login User [admin] logged in failed.

使用logging模块提供的Filter功能。

直接给出实例代码:

# -*- coding: utf-8 -*-

import logging
import logging.config
import logging.handlers


log_config_dict = {
    "version": 1,
    "fORMatters": {
        "format_def": {
            "format": "%(levelname)-8s %(asctime)s %(name)s %(ip)s "
            "%(method)s %(path)s %(message)s",
        },
    },
    "handlers": {
        "handler_http": {
            "class": "logging.handlers.HTTPHandler",
            "formatter": "format_def",
            "level": "INFO",
            "host": "192.168.100.1:8888",
            "url": "/log/admin",
            "method": "POST",
        },
    },
    "loggers": {
        "admin.config": {
            "level": "INFO",
            "propagate": 0,
            "handlers": ["handler_http"],
        },
        "admin.api": {
            "level": "INFO",
            "propagate": 0,
            "handlers": ["handler_http"],
        }
    },
}


class RequestFilter(logging.Filter):
    """A filter used to add extra information to a record.

    Add ip, method and path information to a record for a HTTP request.

    Attributes:
        name: logger's name
    """
    def __init__(self, name):
        self.name = name

    def filter(self, record):
        # 这里调用getMessage()方法得到格式化后的日志内容,
        # HTTP服务器上只要读取POST中的message参数即可。
        record.message = record.getMessage()
        return True


def init_log():
    logging.config.dictConfig(log_config_dict)


def get_logger(name):
    if type(name) is not str:
        return None

    log = logging.getLogger(name)
    log.addFilter(RequestFilter(name))  # 添加一个过滤器用来进行消息格式化
    log.addHandler(logging.NullHandler())

    return log


def get_config_logger():
    return get_logger("admin.config")


def get_api_logger():
    return get_logger("admin.api")

上面的中的中文注释部分直接说明了解决方案。

--结束END--

本文标题: Python Logging库HTTP

本文链接: https://www.lsjlt.com/news/193002.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python Logging库HTTP
    Python的logging库是标准库中用来实现日志的库,功能强大,而且使用起来也算是方便。该库提供了很多个不同的Handler,用来对日志进行不同的处理。例如FileHandler用来将日志记录到文件,RotateFileHandle...
    99+
    2023-01-31
    Python Logging HTTP
  • Python标准库 - logging
    编写代码时, 常要跟踪下其运行过程, 记录日志是常用的方式. 较简单的就是print命令打印到终端, 或通过open函数写入文件. 但随着代码量的增加, 该方式不可控的弊端, 也凸显出来, 这也正是logging模块出现的背景.对于logg...
    99+
    2023-01-31
    标准 Python logging
  • python标准库--logging模块
    logging模块的几个级别,默认情况下Logging模块有6个级别,代码如下#!/usr/bin/env python # coding: utf-8 __author__ = '...
    99+
    2023-01-30
    模块 标准 python
  • python-logging
    logging.debug('这是一条debug,开始使用日志啦') logging.info('这是一条info,开始使用日志啦') logging.warning('这是一条warning,开始使用日志啦') logging.error...
    99+
    2023-01-31
    python logging
  • 怎么使用python的logging库
    logging是Python标准库中用于记录日志的模块。它提供了一种简明但可变的方式,用于记录程序中的事件,以便后续进行调试和分析。使用logging库的基本步骤如下:导入logging库import logging配置日志记录器loggi...
    99+
    2023-05-16
    Python logging
  • python logging Timed
      我的定时任务会在每天早上5点钟调一个交易,交易中日志用的logging模块,今天发现log有问题,排查如下。查看日志的时候发现本应5点打的日志,日志时间却显示为2016-09-12 21:00:02,379 - INFO - novel...
    99+
    2023-01-31
    python logging Timed
  • python logging with
    Recently, I was made a service which can provide a simple way to get best model. so, i spent lot of time to read source...
    99+
    2023-01-31
    python logging
  • 2022最新Python日志库logging总结
    目录1、日志级别2、logging 流程3、日志输出格式4、基本使用5、自定义 Logger6、Logger 配置7、实战中的问题在部署项目时,不可能直接将所有的信息都输出到控制台中...
    99+
    2022-11-11
    Python日志库logging Python日志库
  • 关于如何使用python的logging库
    logging是Python标准库中用于记录日志的模块。它提供了一种简单但灵活的方法来记录程序中的事件,以便稍后进行调试和分析。 使用logging库的基本步骤如下: 导入loggi...
    99+
    2023-05-17
    python库 python logging
  • python标准库logging模块怎么用
    本文小编为大家详细介绍“python标准库logging模块怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python标准库logging模块怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题1:如...
    99+
    2023-06-30
  • Python学习-logging
    Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志。logging的日志可以分为debug(),info(),warning(),error()和...
    99+
    2023-01-31
    Python logging
  • Python - logging模块
    logging模块两种配置日志输出格式: 1、 输出如下: 2、 第二种方式如下: 注意 logger = logging.getLogger() 不带参数默认是root用户。 logger1 = logging.getL...
    99+
    2023-01-31
    模块 Python logging
  • python中的logging
    python logging模块可能会令人困惑的地方通过参阅python logging模块的代码,发现一些有趣的现象: 1. logging对象其实是一个树形结构,每个创建的logging对象都是root logging对象的孩子结点。当...
    99+
    2023-01-31
    python logging
  • Python logging模块
    logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式:    1)使用logging提供的模块级别的函数(logging.basicConfig,...
    99+
    2023-01-31
    模块 Python logging
  • python logging 模块
    python logging模块   import sys  import logging    #首先获得一个类  logger = logging.getLogger('example') #example为名字 logger.setL...
    99+
    2023-01-31
    模块 python logging
  • python Howto之logging
        本文来源于对py2.7.9 docs中howto-logging部分加之源代码的理解。官方文档链接如下,我用的是下载的pdf版本,应该是一致的:https://docs.python.org/2/howto/logging.html...
    99+
    2023-01-31
    python Howto logging
  • python模块--logging
    logging模块                                                                                                               ...
    99+
    2023-01-31
    模块 python logging
  • .NET 6中间件Http Logging使用介绍
    Intro .NET 6 会引入一个 Http logging 的中间件,可以用来帮助我们比较方便记录请求和响应的信息 Sample 废话不多说,直接来看示例吧 var build...
    99+
    2022-11-12
    .NET 6 Http Logging Http Logging
  • .NET 6中间件Http Logging怎么使用
    这篇文章主要介绍“.NET 6中间件Http Logging怎么使用”,在日常操作中,相信很多人在.NET 6中间件Http Logging怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-22
  • Python标准库中的logging用法示例
    本篇文章给大家带来了关于Python的相关知识,logging是Python标准库中记录常用的记录日志库,通过logging模块存储各种格式的日志,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等,下面一起来看一下...
    99+
    2022-09-05
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作