>>12/12/201011:46:36AMiswhenthiseventwaslogged." />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python & django logging 小結(jié)

系統(tǒng) 1615 0

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用

python & django logging 小結(jié)_第1張圖片

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')
          
        

配置日志記錄

三種方式

  1. 像上面用方法配置
  2. 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
            },
        }
    }
                  
                
  3. 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í)踐

  1. disable_existing_loggers == False

    django本身是有一個(gè)logging配置的,這里有一個(gè)標(biāo)志位去決定是否需要取消掉.

  2. 靈活運(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲欧美国产视频 | 欧美一区二区三区国产精品 | 亚洲精品在线播放 | 亚洲一区二区在线视频 | 午夜精品久久久久久99热7777 | 一级做一级爱a做片性视频视频 | 久久夜夜 | 三级理论中文字幕在线播放 | 欧美成人在线影院 | 中国美女一级黄色片 | 免费视频91| 午夜电影一区 | 欧美在线观看视频 | 午夜精品久久久久久久99黑人 | 日韩手机在线观看 | 日韩高清第一页 | 欧美性色生活片免费播放 | 无码日韩精品一区二区免费 | 亚洲欧美综合乱码精品成人网 | 欧美黑人在线视频 | 免费高清伧理片午夜伧理片 | 日日天天| 亚洲色图片区 | 奇米影视亚洲春色 | 天天影院在线观看 | 久久精品2 | 免费成人高清 | 欧美中文字幕 | 久草视频在 | 欧洲亚洲精品久久久久 | 国产AV一区二区三区传媒 | 99久久亚洲精品日本无码 | 2017av伦理片 | 美女露尿口视频 | 一级毛片免费在线播放 | 国产美女极品免费视频 | 国产人成午夜免视频网站 | 青草青在线 | 国产在线激情 | 综合国产| 中文字字幕在线 |