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() + "\n" + record.exc_text
        return formatted.replace("\n", "\n    ")

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有问题欢迎与我讨论,共同进步。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
269 0
|
6月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
286 1
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
631 5
|
安全 BI 网络安全
EventLog Analyzer 如何满足等保合规要求?密码有效期、产品日志保留、配置备份三大核心问题全面解答
EventLog Analyzer(ELA)助力企业满足网络安全等级保护要求,支持配置自动/手动备份、日志180天留存及密码策略管理,提升合规性与安全运营效率。
132 0
|
5月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
279 1
|
5月前
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。
|
6月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
738 4
|
8月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
270 22
|
7月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
834 54