zoukankan      html  css  js  c++  java
  • django1.4日志模块配置及使用

    一、默认日志配置

    在django 1.4中默认有一个简单的日志配置,如下

    # A sample logging configuration. The only tangible logging
    # performed by this configuration is to send an email to
    # the site admins on every HTTP 500 error when DEBUG=False.
    # See http://docs.djangoproject.com/en/dev/topics/logging for
    # more details on how to customize your logging configuration.
    LOGGING = { 
        'version': 1,
        'disable_existing_loggers': False,
        'filters': {
            'require_debug_false': {
                '()': 'django.utils.log.RequireDebugFalse'
            }   
        },  
        'handlers': {
            'mail_admins': {
                'level': 'ERROR',
                'filters': ['require_debug_false'],
                'class': 'django.utils.log.AdminEmailHandler'
            }   
        },  
        'loggers': {
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': True,
            },  
        }   
    }

    可以看出默认的‘disable_existing_loggers’值为False。

    默认没有定义formatters。

    字典中,组结束没有加逗号,所以在增加时需要写上。

    二、简单例子

    1、配置settings.py中LOGGING

    增加下面绿色部分内容配置。

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {
                'format': '%(levelname)s %(asctime)s %(message)s'
            },
        },
        'filters': {
            'require_debug_false': {
                '()': 'django.utils.log.RequireDebugFalse'
            },
        },
        'handlers': {
            'mail_admins': {
                'level': 'ERROR',
                'filters': ['require_debug_false'],
                'class': 'django.utils.log.AdminEmailHandler'
            },
            'test1_handler':{
                'level':'DEBUG',
                'class':'logging.handlers.RotatingFileHandler',
                'filename':'/yl/smartcloud/smartcloud/lxytest.log',
                'formatter':'standard',
            },
        },
        'loggers': {
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': True,
            },
            'test1':{
                'handlers':['test1_handler'],
                'level':'INFO',
                'propagate':False
            },
        }
    }

    配置中level,filename之类的可自定义,需要几个文件就配置几个handler和logger。

    2、使用

    • 导入logging
    • 如果在用到log的view.py中,想使用test1这个日志,就写:
      • log=logging.getLogger('test1')
      • log.error()
    •  在日志内容中传递变量,log.error("Get html error, %s" % (e))
    #!/usr/bin/python
    #-*- coding: UTF-8 -*-
    
    import logging
    from django.http import HttpResponseRedirect,HttpResponse, Http404
    from django.shortcuts import render_to_response, get_object_or_404
    from django.template import RequestContext
    
    
    log=logging.getLogger('test1')
    
    def getHtml(request,arg):
        try:
            url=request.path
            url=url[1:]
            return render_to_response(url,RequestContext(request))
        except Exception,e:
            #log.error("Get html error, %s" % (e))
            log.error("日志内容")
            raise Http404

     

    使用变量后的log如下:

    三、封装django logging模块

    django自带的logging模块也是可以用的,如果要求更高,希望加一些自定义的颜色,格式等,可进行下面操作。

    1、将log封装成一个单独的app

    [root@yl-web-test log]# django-admin.py startapp log
    [root@yl-web-test log]# ls
    __init__.py  models.py  tests.py  views.py

    2、创建一个log.py,内容如下

    #!/usr/bin/python
    
    import os
    import sys
    import time
    sys.path.append("..")
    import conf
    import logging
    import logging.handlers
    
    try:
        import curses
        curses.setupterm()
    except:
        curses = None
    
    default_logfile = getattr(conf,'SMARTCLOUD_LOGFILE')class Singleton(type):
        """Singleton Metaclass"""
        def __init__(cls,name,bases,dic):
            super(Singleton,cls).__init__(name,bases,dic)
            cls.instance = None
        def __call__(cls, *args, **kwargs):
            if cls.instance is None:
                cls.instance = super(Singleton,cls).__call__(*args,**kwargs)
            return cls.instance
    
    class MessageFormatter(logging.Formatter):
        def __init__(self,color,*args,**kwargs):
            logging.Formatter.__init__(self,*args,**kwargs)
            self._color=color
            if color and curses:
                fg_color = unicode(curses.tigetstr("setaf") or
                                            curses.tigetstr("setf") or "", "ascii")
    
                self._colors={
                        logging.DEBUG: unicode(curses.tparm(fg_color,2),"ascii"),
                        logging.INFO: unicode(curses.tparm(fg_color,6),"ascii"),
                        logging.WARNING: unicode(curses.tparm(fg_color, 3), "ascii"),
                        logging.ERROR: unicode(curses.tparm(fg_color, 5), "ascii"),
                        logging.FATAL: unicode(curses.tparm(fg_color, 1), "ascii"),
                        }
                self._normal = unicode(curses.tigetstr("sgr0"), "ascii")
    
        def format(self,record):
            try:
                record.message = record.getMessage()
            except Exception, e:
                record.message = "Bad message (%r): %r" % (e, record.__dict__)
            record.asctime = time.strftime("%Y/%m/%d %H:%M:%S",
                                                                self.converter(record.created))
            prefix = '[%(levelname)-8s %(asctime)s] ' % record.__dict__
            if self._color and curses:
                prefix = (self._colors.get(record.levelno, self._normal) +
                                                                            prefix + self._normal)
            formatted = prefix + record.message
            if record.exc_info:
                if not record.exc_text:
                    record.exc_text = self.formatException(record.exc_info)
            if record.exc_text:
                formatted = formatted.rstrip() + "
    " + record.exc_text
            return formatted.replace("
    ", "
        ")
    
    class MessageLog(object):
        __metaclass__ = Singleton
    
        def __init__(self, logfile=default_logfile,):
            self._LEVE = {1:logging.INFO, 2:logging.WARNING, 3:logging.ERROR,
                                                          4:logging.DEBUG, 5:logging.FATAL}
            self.loger = logging.getLogger()
            self._logfile = logfile
            self.init()
    
        def init(self):
            if not os.path.exists(self._logfile):
                os.mknod(self._logfile)
            handler = logging.handlers.RotatingFileHandler(self._logfile)
            handler.setFormatter(MessageFormatter(color=True))
            self._handler = handler
            self.loger.addHandler(handler)
    
        def INFO(self,msg,leve=1):
            self.loger.setLevel(self._LEVE[leve])
            self.loger.info(msg)
    
        def WARNING(self, msg, leve=2):
            self.loger.setLevel(self._LEVE[leve])
            self.loger.warning(msg)
    
        def ERROR(self, msg, leve=3):
            self.loger.setLevel(self._LEVE[leve])
            self.loger.error(msg)
    
        def DEBUG(self, msg, leve=4):
            self.loger.setLevel(self._LEVE[leve])
            self.loger.debug(msg)
    
        def FATAL(self, msg, leve=5):
            self.loger.setLevel(self._LEVE[leve])
            self.loger.fatal(msg)

    conf.py是一个配置文件,在log app同目录,里面配置了log文件目录。

    import os
    
    SMARTCLOUD_LOGFILE='/yl/smartcloud/log/smartcloud.log'

    3、测试

    在log.py结果加上一段测试代码如下:

    if __name__ == "__main__":
        LOG = MessageLog()
        str1 = "aaaaaaaa"
        str2 = "bbbbbbbbbb"
        LOG.INFO("#%s###################################"
                            "@@@@%s@@@@@@@@@@@" %(str1,str2))
        LOG.WARNING("####################################")
        LOG.ERROR("####################################")
        LOG.DEBUG("####################################")
        LOG.FATAL("####################################")

    测试结果如下:

    4、在view中使用

    usage e.g:
    
    from log import MessageLog
    LOG = MessageLog('your log file by full path')
    or LOG = MessageLog()
    default logfile name is '/yl/smartcloud/log/smartcloud.log'
    
    LOG.INFO('some message')
    LOG.WARNING('some message')
    LOG.ERROR('some message')
    LOG.DEBUG('some message')
    LOG.FATAL('some message')

    本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4702026.html有问题欢迎与我讨论,共同进步。

  • 相关阅读:
    windows mysql 的myini
    NuGet 程序源包
    链表更新
    程序包需要 NuGet 客户端版本“XXXXX”或更高版本,但当前的 NuGet 版本为“XXXXXXXXXX”
    chrome下调试安卓app 之 ionic
    ionic3 在ios9.0 系统下 会出现ReferenceError:Can't find variable:Intl 错误提示
    抓取html 生成图片
    grunt 打包 分解(并非原创)
    关于 vue 日期格式的过滤
    Android Studio
  • 原文地址:https://www.cnblogs.com/starof/p/4702026.html
Copyright © 2011-2022 走看看