摘要:小结基本一次配置多处生效高级会用到一个和信息有关的对象接口被应用层我们开发者调用的写文件的挂在上过滤文本的可以给用也可以给用定义的格式给用的格式时间格式分隔符例子详细参数源码里面有也可以看文档返回或者将会被过滤可以是一个类也可以
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用
formatterfmt
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 Falsehandler
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
略
djangodjango默认使用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配置的,这里有一个标志位去决定是否需要取消掉.
灵活运用propagate 和 logging.getLogger(__name__)
通过 . 找父亲.
"a.b" 是 ‘a.b.c’的父亲. ‘a.b’是logger name
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45064.html
本文主要是阐述了运用Python建立第一位Django架构程序流程,文章内容紧扣主题进行详尽的基本介绍,具有很强的实用价值,感兴趣的朋友可以了解一下 一.系统变量 鼠标右键电脑–>>特性–>>高端系统配置–>>高端–>>系统变量–>> 设定PATH特...
Django对于专业人士来说,应该是不会陌生的,那么,他们平常中都会应用到什么呢?主要还是应用到mysqlclient,使用mysqlclient服务连接并写入数据库,具体的内容,下面给大家详细解答一下。 Django使用mysqlclient服务连接并写入数据库 准备 1.创建Django程序,安装Django服务(详情请看上上节) 2.创建子应用(详情请看上上节) 3.连接数据库...
Python中的功能还是相当的多的,比如,会涉及到使用Django定时任务,在工作当中,它的用途是比较的多的,其中,测试工程师用到这种的功能是比较多,所以我们要去进行详细的了解下,下面就给大家详细的解答下。 在使用的django做测试平台时,,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔10分钟执行一次,也可能是定点时间,比如14:00执行,...
小编写这篇文章的主要目的,就是教给大家,如何使用Django+Pytest,并用Django+Pytest搭建在线自动化测试平台,具体怎么做呢?下面给大家做一个详细的解答。 一、测试平台: 解决分散用例执行方式,提供统一测试用例执行过程、用例管理、测试报告 主要是基于: fastapi+vue.js django+vue.js django 二、搭建过程 2.1使用django...
小编写这篇文章的主要目的,主要是给大家去进行讲解Django项目实例情况,包括celery的一些具体使用情况介绍,学习这些的话,对我们的工作和生活帮助还是很大的,但是怎么样才能够更快的进行上手呢?下面就一个具体实例给大家进行解答。 1、django应用Celery django框架请求/响应的过程是同步的,框架本身无法实现异步响应。 但是我们在项目过程中会经常会遇到一些耗时的任务,比如:...
阅读 878·2023-04-25 23:40
阅读 3688·2021-11-22 15:22
阅读 3483·2021-10-09 09:44
阅读 3378·2021-09-23 11:52
阅读 1231·2021-09-22 15:43
阅读 738·2021-09-10 10:51
阅读 2188·2021-09-06 15:02
阅读 3151·2021-09-06 15:02