摘要:小結(jié)基本一次配置多處生效高級會用到一個和信息有關(guān)的對象接口被應(yīng)用層我們開發(fā)者調(diào)用的寫文件的掛在上過濾文本的可以給用也可以給用定義的格式給用的格式時間格式分隔符例子詳細(xì)參數(shù)源碼里面有也可以看文檔返回或者將會被過濾可以是一個類也可以
python & django logging 小結(jié)
[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信息有關(guān)的對象
loggers
接口,被應(yīng)用層(我們開發(fā)者)調(diào)用的
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將會被過濾
可以是一個類,也可以是函數(shù).
建議用類的形式, 因?yàn)閹ame,將來想remove filter更方便
Filter類長這樣
class Filter(object): def __init__(self, name=""): self.name = name self.nlen = len(name) def filter(self, record): return True
函數(shù)
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默認(rèn)使用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!")最佳實(shí)踐
disable_existing_loggers == False
django本身是有一個logging配置的,這里有一個標(biāo)志位去決定是否需要取消掉.
靈活運(yùn)用propagate 和 logging.getLogger(__name__)
通過 . 找父親.
"a.b" 是 ‘a(chǎn).b.c’的父親. ‘a(chǎn).b’是logger name
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45064.html
本文主要是闡述了運(yùn)用Python建立第一位Django架構(gòu)程序流程,文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,具有很強(qiáng)的實(shí)用價(jià)值,感興趣的朋友可以了解一下 一.系統(tǒng)變量 鼠標(biāo)右鍵電腦–>>特性–>>高端系統(tǒng)配置–>>高端–>>系統(tǒng)變量–>> 設(shè)定PATH特...
Django對于專業(yè)人士來說,應(yīng)該是不會陌生的,那么,他們平常中都會應(yīng)用到什么呢?主要還是應(yīng)用到mysqlclient,使用mysqlclient服務(wù)連接并寫入數(shù)據(jù)庫,具體的內(nèi)容,下面給大家詳細(xì)解答一下。 Django使用mysqlclient服務(wù)連接并寫入數(shù)據(jù)庫 準(zhǔn)備 1.創(chuàng)建Django程序,安裝Django服務(wù)(詳情請看上上節(jié)) 2.創(chuàng)建子應(yīng)用(詳情請看上上節(jié)) 3.連接數(shù)據(jù)庫...
Python中的功能還是相當(dāng)?shù)亩嗟模热纾瑫婕暗绞褂肈jango定時任務(wù),在工作當(dāng)中,它的用途是比較的多的,其中,測試工程師用到這種的功能是比較多,所以我們要去進(jìn)行詳細(xì)的了解下,下面就給大家詳細(xì)的解答下。 在使用的django做測試平臺時,,多多少少都會遇到需要定時任務(wù)的功能,比如定時執(zhí)行任務(wù),檢查訂單之類的。可能是一段時間,比如每隔10分鐘執(zhí)行一次,也可能是定點(diǎn)時間,比如14:00執(zhí)行,...
小編寫這篇文章的主要目的,就是教給大家,如何使用Django+Pytest,并用Django+Pytest搭建在線自動化測試平臺,具體怎么做呢?下面給大家做一個詳細(xì)的解答。 一、測試平臺: 解決分散用例執(zhí)行方式,提供統(tǒng)一測試用例執(zhí)行過程、用例管理、測試報(bào)告 主要是基于: fastapi+vue.js django+vue.js django 二、搭建過程 2.1使用django...
小編寫這篇文章的主要目的,主要是給大家去進(jìn)行講解Django項(xiàng)目實(shí)例情況,包括celery的一些具體使用情況介紹,學(xué)習(xí)這些的話,對我們的工作和生活幫助還是很大的,但是怎么樣才能夠更快的進(jìn)行上手呢?下面就一個具體實(shí)例給大家進(jìn)行解答。 1、django應(yīng)用Celery django框架請求/響應(yīng)的過程是同步的,框架本身無法實(shí)現(xiàn)異步響應(yīng)。 但是我們在項(xiàng)目過程中會經(jīng)常會遇到一些耗時的任務(wù),比如:...
閱讀 932·2023-04-25 23:40
閱讀 3712·2021-11-22 15:22
閱讀 3552·2021-10-09 09:44
閱讀 3405·2021-09-23 11:52
閱讀 1260·2021-09-22 15:43
閱讀 789·2021-09-10 10:51
閱讀 2210·2021-09-06 15:02
閱讀 3204·2021-09-06 15:02