资讯专栏INFORMATION COLUMN

python & django logging 小结

wangshijun / 2557人阅读

摘要:小结基本一次配置多处生效高级会用到一个和信息有关的对象接口被应用层我们开发者调用的写文件的挂在上过滤文本的可以给用也可以给用定义的格式给用的格式时间格式分隔符例子详细参数源码里面有也可以看文档返回或者将会被过滤可以是一个类也可以

python & django logging 小结

[TOC]

python 基本

一次配置,多处生效

import logging
logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p")
logging.warning("is when this event was logged.")

>>>12/12/2010 11:46:36 AM is when this event was logged.
高级

log_record

filters会用到,一个和log信息有关的对象

loggers

接口,被应用层(我们开发者)调用的

handlers

写文件的,挂在logger上

filters

过滤文本的, 可以给logger用,也可以给handler用

formatters

定义log的格式, 给handler用

formatter

fmt

message的格式

datefmt

时间格式

style

分隔符

%(asctime)s - %(levelname)s - %(message)s

&(asctime)s - &(levelname)s - &(message)s

例子

my_formater = logging.Formatter(fmt="%(asctime)s - %(levelname)s - %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p", style="%")

详细参数

源码里面有,也可以看文档

filter

返回True或者False

False将会被过滤

可以是一个类,也可以是函数.

建议用类的形式, 因为带name,将来想remove filter更方便

Filter类长这样

class Filter(object):
    def __init__(self, name=""):
        self.name = name
        self.nlen = len(name)
    def filter(self, record):
        return True

函数

def my_filter(record):
    return False

handler

logging模块提供了很多handler.

logging.StreamHandler(sys.stdout)logging.RotatingFileHandler 常见

handler.addFilter()

handler.setFormatter()

my_handler.setLevel()

logger

定义logger

logger = logging.getLogger("666")

set level

logger.setLevel(logging.DEBUG)

logger.addFilter()

logger.addHandler()

logger.info("message")

例子
import logging
logger = logging.getLogger("spam_application")
logger.setLevel(logging.DEBUG)
my_handler = logging.StreamHandler()
my_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
my_handler.setFormatter(formatter)
logger.addHandler(my_handler)
logger.info("creating an instance of auxiliary_module.Auxiliary")
>>> 2019-07-03 16:02:30,952 - spam_application - INFO - creating an instance of auxiliary_module.Auxiliary
my_filter = lambda record: True
my_handler.addFilter(my_filter)
logger.info("creating an instance of auxiliary_module.Auxiliary")
>>> 2019-07-03 16:03:06,858 - spam_application - INFO - creating an instance of auxiliary_module.Auxiliary
my_filter = lambda record: False
my_handler.addFilter(my_filter)
logger.info("creating an instance of auxiliary_module.Auxiliary")
配置日志记录

三种方式

像上面用方法配置

dict

LOGGING = {
    "version": 1,
    "disable_existing_loggers": True,
    "formatters": {
        "standard": {
            "format": "[%(asctime)s][%(filename)s] - %(funcName)s[line:%(lineno)d] - [%(levelname)s]: %(message)s"
        },
    },
    "filters": {
    },
    "handlers": {
        "security_log": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": os.path.join(cf["log"]["path"], "security_log.log"),
            "maxBytes": 1024 * 1024 * 10,
            "backupCount": 10,
            "formatter": "standard",
        },
        "event_log": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": os.path.join(cf["log"]["path"], "event_log.log"),
            "maxBytes": 1024 * 1024 * 10,
            "backupCount": 10,
            "formatter": "standard",
        },
        "console": {
            "level": "ERROR",
            "class": "logging.StreamHandler",
            "formatter": "standard"
        },
    },
    "loggers": {
        "eventLog": {
            "handlers": ["event_log", "console"],
            "level": "DEBUG",
            "propagate": False
        },
        "security": {
            "handlers": ["security_log", "console", "security_db"],
            "level": "DEBUG",
            "propagate": False
        },
        "system": {
            "handlers": ["system_log", "console", "system_db"],
            "level": "DEBUG",
            "propagate": False
        },
    }
}

file

django

django默认使用dict方式.

logging_settings == settings.LOGGING

logging_config == logging.config.dictConfig

def configure_logging(logging_config, logging_settings):
    if logging_config:
        # First find the logging configuration function ...
        logging_config_func = import_string(logging_config)

        logging.config.dictConfig(DEFAULT_LOGGING)

        # ... then invoke it with the logging settings
        if logging_settings:
            logging_config_func(logging_settings)
例子

理想情况下,如果在settings中配置了LOGGING,直接使用即可.

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error("Something went wrong!")
最佳实践

disable_existing_loggers == False

django本身是有一个logging配置的,这里有一个标志位去决定是否需要取消掉.

灵活运用propagatelogging.getLogger(__name__)

通过 . 找父亲.

"a.b" 是 ‘a.b.c’的父亲. ‘a.b’是logger name

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45064.html

相关文章

  • 运用Python建立第一位Django架构程序流程

      本文主要是阐述了运用Python建立第一位Django架构程序流程,文章内容紧扣主题进行详尽的基本介绍,具有很强的实用价值,感兴趣的朋友可以了解一下  一.系统变量  鼠标右键电脑–>>特性–>>高端系统配置–>>高端–>>系统变量–>>  设定PATH特...

    89542767 评论0 收藏0
  • Django使用mysqlclient服务连接并写入数据库的操作过程

      Django对于专业人士来说,应该是不会陌生的,那么,他们平常中都会应用到什么呢?主要还是应用到mysqlclient,使用mysqlclient服务连接并写入数据库,具体的内容,下面给大家详细解答一下。  Django使用mysqlclient服务连接并写入数据库  准备  1.创建Django程序,安装Django服务(详情请看上上节)  2.创建子应用(详情请看上上节)  3.连接数据库...

    89542767 评论0 收藏0
  • Django定时任务Django-crontab的使用方法介绍

      Python中的功能还是相当的多的,比如,会涉及到使用Django定时任务,在工作当中,它的用途是比较的多的,其中,测试工程师用到这种的功能是比较多,所以我们要去进行详细的了解下,下面就给大家详细的解答下。  在使用的django做测试平台时,,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔10分钟执行一次,也可能是定点时间,比如14:00执行,...

    89542767 评论0 收藏0
  • 使用Django+Pytest,教你搭建在线自动化测试平台

      小编写这篇文章的主要目的,就是教给大家,如何使用Django+Pytest,并用Django+Pytest搭建在线自动化测试平台,具体怎么做呢?下面给大家做一个详细的解答。  一、测试平台:  解决分散用例执行方式,提供统一测试用例执行过程、用例管理、测试报告  主要是基于:  fastapi+vue.js  django+vue.js  django  二、搭建过程  2.1使用django...

    89542767 评论0 收藏0
  • Django中celery的使用项目实例

      小编写这篇文章的主要目的,主要是给大家去进行讲解Django项目实例情况,包括celery的一些具体使用情况介绍,学习这些的话,对我们的工作和生活帮助还是很大的,但是怎么样才能够更快的进行上手呢?下面就一个具体实例给大家进行解答。  1、django应用Celery  django框架请求/响应的过程是同步的,框架本身无法实现异步响应。  但是我们在项目过程中会经常会遇到一些耗时的任务,比如:...

    89542767 评论0 收藏0

发表评论

0条评论

wangshijun

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<