标签归档 python

通过admin

Django日志logging的配置以及处理

      1. logging模块

logging模块为应用程序提供了灵活的手段记录事件、错误、警告和调试信息。对这些信息可以进行收集、筛选、写入文件、发送给系统日志等操作,甚至还可以通过网络发送给远程计算机。

> 日志记录级别

logging模块的重点在于生成和处理日志消息。每条消息由一些文本和指示其严重性的相关级别组成。级别包含符号名称和数字值。

级别 描述
CRITICAL 50 关键错误/消息
ERROR 40 错误
WARNING 30 警告消息
INFO 20 通知消息
DEBUG 10 调试
NOTSET 0 无级别

> 记录器

记录器负责管理日志消息的默认行为,包括日志记录级别、输出目标位置、消息格式以及其它基本细节。

 

关键字参数 描述
filename 将日志消息附加到指定文件名的文件
filemode 指定用于打开文件模式
format 用于生成日志消息的格式字符串
datefmt 用于输出日期和时间的格式字符串
level 设置记录器的级别
stream 提供打开的文件,用于把日志消息发送到文件。

>format 日志消息格式

 

格式 描述
%(name)s 记录器的名称
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s 执行日志记录调用的行号
%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息

 

> 内置处理器

logging模块提供了一些处理器,可以通过各种方式处理日志消息。使用addHandler()方法将这些处理器添加给Logger对象。另外还可以为每个处理器配置它自己的筛选和级别。

handlers.DatagramHandler(host,port):发送日志消息给位于制定host和port上的UDP服务器。

handlers.FileHandler(filename):将日志消息写入文件filename。

handlers.HTTPHandler(host, url):使用HTTP的GET或POST方法将日志消息上传到一台HTTP 服务器。

handlers.RotatingFileHandler(filename):将日志消息写入文件filename。如果文件的大小超出maxBytes制定的值,那么它将被备份为filename1。

由于内置处理器还有很多,如果想更深入了解。可以查看官方手册。

 

2.django 使用logging记录日志

现在大概了解了logging的使用方法,现在可以结合django使用。

> 配置setting.py配置文件

 

#导入模块

import logging

import django.utils.log

import logging.handlers

 

 

LOGGING = {

‘version’: 1,

‘disable_existing_loggers’: True,

‘formatters’: {

‘standard’: {

‘format’: ‘%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s’}  #日志格式

},

‘filters’: {

},

‘handlers’: {

‘mail_admins’: {

‘level’: ‘ERROR’,

‘class’: ‘django.utils.log.AdminEmailHandler’,

‘include_html’: True,

},

‘custom’: {

‘level’:’DEBUG’,

‘class’:’logging.handlers.RotatingFileHandler’,

‘filename’: os.path.join(BASE_DIR+’/logs/’,’all.log’),     #日志输出文件

‘maxBytes’: 1024*1024*5,                  #文件大小

‘backupCount’: 5,                         #备份份数

‘formatter’:’standard’,                   #使用哪种formatters日志格式

},

‘error’: {

‘level’:’ERROR’,

‘class’:’logging.handlers.RotatingFileHandler’,

‘filename’: os.path.join(BASE_DIR+’/logs/’,’all.log’),

‘maxBytes’:1024*1024*5,

‘backupCount’: 5,

‘formatter’:’standard’,

},

‘console’:{

‘level’: ‘DEBUG’,

‘class’: ‘logging.StreamHandler’,

‘formatter’: ‘standard’

},

‘request_handler’: {

‘level’:’DEBUG’,

‘class’:’logging.handlers.RotatingFileHandler’,

‘filename’: os.path.join(BASE_DIR+’/logs/’,’all.log’),

‘maxBytes’: 1024*1024*5,

‘backupCount’: 5,

‘formatter’:’standard’,

},

‘scprits_handler’: {

‘level’:’DEBUG’,

‘class’:’logging.handlers.RotatingFileHandler’,

‘filename’:os.path.join(BASE_DIR+’/logs/’,’all.log’),

‘maxBytes’: 1024*1024*5,

‘backupCount’: 5,

‘formatter’:’standard’,

}

},

‘loggers’: {

‘django’: {

‘handlers’: [‘default’, ‘console’],

‘level’: ‘DEBUG’,

‘propagate’: False

},

‘django.request’: {

‘handlers’: [‘request_handler’],

‘level’: ‘DEBUG’,

‘propagate’: False,

},

‘scripts’: {

‘handlers’: [‘scprits_handler’],

‘level’: ‘INFO’,

‘propagate’: False

},

‘views’: {

‘handlers’: [‘default’, ‘error’],

‘level’: ‘DEBUG’,

‘propagate’: True

},

}

}

 

 

解析:

1.formatters:配置打印日志格式

2.handler:用来定义具体处理日志的方式,可以定义多种,”default”就是默认方式,”console”就是打印到控制台方式。

3.loggers:用来配置用那种handlers来处理日志,比如你同时需要输出日志到文件、控制台。

 

注意:

1.loggers类型为”django”这将处理所有类型日志。

2.sourceDns.webdns.views 应用的py文件

 

> views.py代码配置

123

4

5

6

logger = logging.getLogger(‘sourceDns.webdns.views’)    #刚才在setting.py中配置的loggertry:

mysql= connectMysql(‘127.0.0.1’, ‘3306’, ‘david’)

except Exception,e:

logger.error(e)        #直接将错误写入到日志文件

>查看日志文件 ,可以用tail -f来跟踪log

[root@iZ94qyk9mopZ joke_project]# tail -f logs/all.log |grep jokes.views

2014-11-25 17:32:30,494 [Thread-3:140147426895616] [jokes.views:69] [views:get_jokes_list] [INFO]- get_jokes_list end
2014-11-25 17:37:32,987 [Thread-4:140147426895616] [jokes.views:37] [views:get_jokes_list] [INFO]- get_jokes_list start
2014-11-25 17:37:33,003 [Thread-4:140147426895616] [jokes.views:69] [views:get_jokes_list] [INFO]- get_jokes_list end

通过admin

python 变量命名规范

python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范。于是自己总结了一些,可供参考。
模块名:
小写字母,单词之间用_分割
ad_stats.py

包名:
和模块名一样

类名:
单词首字母大写
AdStats
ConfigUtil

全局变量名(类变量,在java中相当于static变量):
大写字母,单词之间用_分割
NUMBER
COLOR_WRITE

普通变量:
小写字母,单词之间用_分割
this_is_a_var

实例变量:
以_开头,其他和普通变量一样
_price    
_instance_var

私有实例变量(外部访问会报错):
以__开头(2个下划线),其他和普通变量一样
__private_var

专有变量:
__开头,__结尾,一般为python的自有变量,不要以这种方式命名
__doc__
__class__

普通函数:
和普通变量一样:
get_name()
count_number()
ad_stat()

私有函数(外部访问会报错):
以__开头(2个下划线),其他和普通函数一样
__get_name()

通过admin

将Python的datetime转换为Unix时间戳timestamp

from datetime import datetime
d = datetime.utcnow()
import calendar
ts = calendar.timegm(d.utctimetuple())

用date命令来验证

$ date -ud @1382422118
2013年 10月 22日 星期二 06:08:38 UTC

在Unix系统上,描述时间的传统方式是,给一个自1970年初到现在的秒数.

from time import time
ts = int(time())
本文出自:http://zhiwei.li/text, 感谢原作者分享。
通过admin

Django mysql提交中文出错的问题

Django使用mysql的情况下默认编码都是utf-8,所以在一开始创建database的时候必须制定utf-8编码,否则在提交中文字符的时候可能会报错。

 

Creating your database

You can create your database using the command-line tools and this SQL:

CREATE DATABASE <dbname> CHARACTER SET utf8;

This ensures all tables and columns will use UTF-8 by default.