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.
高級(jí)
-
log_record
filters會(huì)用到,一個(gè)和log信息有關(guān)的對(duì)象
-
loggers
接口,被應(yīng)用層(我們開(kāi)發(fā)者)調(diào)用的
-
handlers
寫(xiě)文件的,掛在logger上
-
filters
過(guò)濾文本的, 可以給logger用,也可以給handler用
-
formatters
定義log的格式, 給handler用
formatter
-
fmt
message的格式
-
datefmt
時(shí)間格式
-
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='%')
詳細(xì)參數(shù)
源碼里面有,也可以看文檔
filter
- 返回True或者False
- False將會(huì)被過(guò)濾
- 可以是一個(gè)類,也可以是函數(shù).
- 建議用類的形式, 因?yàn)閹ame,將來(lái)想remove filter更方便
-
Filter類長(zhǎng)這樣
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 False
handler
- logging模塊提供了很多handler.
-
logging.StreamHandler(sys.stdout)
和logging.RotatingFileHandler
常見(jiàn) -
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默認(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
== Falsedjango本身是有一個(gè)logging配置的,這里有一個(gè)標(biāo)志位去決定是否需要取消掉.
-
靈活運(yùn)用
propagate
和logging.getLogger(__name__)
通過(guò)
.
找父親.'a.b' 是 ‘a(chǎn).b.c’的父親. ‘a(chǎn).b’是logger name
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
