例如实例
Copy # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os . path . dirname (os.path. dirname (os.path. abspath ( __file__ )))
LOG_DIR = "../log"
import platform
from pathlib import Path
if platform . system () == "Linux" or platform . system () == "Windows" :
# linux or windows
Path (LOG_DIR). mkdir (parents = True , exist_ok = True )
elif platform . system () == "Darwin" or platform . system () == "Mac" :
# OS X,
# you could not create a folder at /data/logs dure to OS default policy
LOG_DIR = BASE_DIR
LOGGING = {
'version' : 1 ,
'disable_existing_loggers' : False ,
'formatters' : {
'simple' : { # exact format is not important, this is the minimum information
'format' : ' %(asctime)s %(name)-12s %(lineno)d %(levelname)-8s %(message)s ' ,
},
},
'handlers' : {
'console' : {
'class' : 'logging.StreamHandler' ,
'formatter' : 'simple' ,
},
'mail_admins' : { # Add Handler for mail_admins for `warning` and above
'level' : 'ERROR' ,
'class' : 'django.utils.log.AdminEmailHandler' ,
},
'file' : {
#'level': 'INFO',
'class' : 'logging.FileHandler' ,
'formatter' : 'simple' ,
'filename' : os . path . join (LOG_DIR, 'recruitment.admin.log' ),
},
'performance' : {
#'level': 'INFO',
'class' : 'logging.FileHandler' ,
'formatter' : 'simple' ,
'filename' : os . path . join (LOG_DIR, 'recruitment.performance.log' ),
},
},
'root' : {
'handlers' : [ 'console' , 'file' ] ,
'level' : 'INFO' ,
},
'loggers' : {
"django_python3_ldap" : {
"handlers" : [ "console" , "file" ] ,
"level" : "DEBUG" ,
},
"interview.performance" : {
"handlers" : [ "console" , "performance" ] ,
"level" : "INFO" ,
"propagate" : False ,
},
},
}
在视图中使用
Copy import logging
# 生成一个以当前文件名为名字的logger实例
logger = logging . getLogger ( __name__ )
# 生成一个名为collect的logger实例
collect_logger = logging . getLogger ( "collect" )
def index ( request ):
logger . debug ( "我是debug" )
logger . info ( "我是info" )
logger . error ( "发现一个error" )
collect_logger . info ( "user1:广东" )
return HttpResponse ( "OK" )
Logger模块
是python中用于便捷记录日志且线程安全的模块
使用logging模块记录日志涉及四个主要类:
logger提供了应用程序可以直接使用的接口;
handler将(logger创建的)日志记录发送到合适的目的输出;
filter提供了细度设备来决定输出哪条日志记录;
formatter决定日志记录的最终输出格式
1.具体介绍:
logger
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名。
比如聊天工具的图形界面模块可以这样获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模块可以这样:
Copy LOG = logging . getLogger (”chat.kernel”)
Logger . setLevel (lel): 指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger . addFilter (filt) 、Logger . removeFilter (filt): 添加或删除指定的filter
Logger . addHandler (hdlr) 、Logger . removeHandler (hdlr) :增加或删除指定的handler
Logger . debug () 、Logger . info () 、Logger . warning () 、Logger . error () 、Logger . critical () :可以设置的日志级别
handler
handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
用法:
Copy Handler . setLevel (lel): 指定被处理的信息级别,低于lel级别的信息将被忽略
Handler . setFormatter () :给这个handler选择一个格式
Handler . addFilter (filt) 、Handler . removeFilter (filt) :新增或删除一个filter对象
常用的Handler:
1) logging.StreamHandler 使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是: StreamHandler([strm])
ps:其中strm参数是一个文件对象。默认是sys.stderr
2) logging.FileHandler
和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
ps:filename是文件名,必须指定一个文件名;mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。
3) logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
*ps:其中filename和mode两个参数和FileHandler一样。*maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
4) logging.handlers.TimedRotatingFileHandler
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是: TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
ps:其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。interval是时间间隔。when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒 M 分 H 小时 D 天 W 每星期(interval==0时代表星期一) midnight 每天凌晨
2.应用:
在Django中的使用
1、项目里sesetti.py里配置
Copy BASE_LOG_DIR = os . path . join (BASE_DIR, "log" )
LOGGING = {
'version' : 1 , # 保留字
'disable_existing_loggers' : False , # 禁用已经存在的logger实例
# 日志文件的格式
'formatters' : {
# 详细的日志格式
'standard' : {
'format' : '[ %(asctime)s ][ %(threadName)s : %(thread)d ][task_id: %(name)s ][ %(filename)s : %(lineno)d ]'
'[ %(levelname)s ][ %(message)s ]'
},
# 简单的日志格式
'simple' : {
'format' : '[ %(levelname)s ][ %(asctime)s ][ %(filename)s : %(lineno)d ] %(message)s '
},
# 定义一个特殊的日志格式
'collect' : {
'format' : ' %(message)s '
}
},
# 过滤器
'filters' : {
'require_debug_true' : {
'()' : 'django.utils.log.RequireDebugTrue' ,
},
},
# 处理器
'handlers' : {
# 在终端打印
'console' : {
'level' : 'DEBUG' ,
'filters' : [ 'require_debug_true' ] , # 只有在Django debug为True时才在屏幕打印日志
'class' : 'logging.StreamHandler' , #
'formatter' : 'simple'
},
# 默认的
'default' : {
'level' : 'INFO' ,
'class' : 'logging.handlers.RotatingFileHandler' , # 保存到文件,自动切
'filename' : os . path . join (BASE_LOG_DIR, "xxx_info.log" ), # 日志文件
'maxBytes' : 1024 * 1024 * 50 , # 日志大小 50M
'backupCount' : 3 , # 最多备份几个
'formatter' : 'standard' ,
'encoding' : 'utf-8' ,
},
# 专门用来记错误日志
'error' : {
'level' : 'ERROR' ,
'class' : 'logging.handlers.RotatingFileHandler' , # 保存到文件,自动切
'filename' : os . path . join (BASE_LOG_DIR, "xxx_err.log" ), # 日志文件
'maxBytes' : 1024 * 1024 * 50 , # 日志大小 50M
'backupCount' : 5 ,
'formatter' : 'standard' ,
'encoding' : 'utf-8' ,
},
# 专门定义一个收集特定信息的日志
'collect' : {
'level' : 'INFO' ,
'class' : 'logging.handlers.RotatingFileHandler' , # 保存到文件,自动切
'filename' : os . path . join (BASE_LOG_DIR, "xxx_collect.log" ),
'maxBytes' : 1024 * 1024 * 50 , # 日志大小 50M
'backupCount' : 5 ,
'formatter' : 'collect' ,
'encoding' : "utf-8"
}
},
'loggers' : {
# 默认的logger应用如下配置
'' : {
'handlers' : [ 'default' , 'console' , 'error' ] , # 上线之后可以把'console'移除
'level' : 'DEBUG' ,
'propagate' : True , # 向不向更高级别的logger传递
},
# 名为 'collect'的logger还单独处理
'collect' : {
'handlers' : [ 'console' , 'collect' ] ,
'level' : 'INFO' ,
}
},
}
2.使用
在视图函数中的应用实例
Copy import logging
# 生成一个以当前文件名为名字的logger实例
logger = logging . getLogger ( __name__ )
# 生成一个名为collect的logger实例
collect_logger = logging . getLogger ( "collect" )
def index ( request ):
logger . debug ( "我是debug" )
logger . info ( "我是info" )
logger . error ( "发现一个error" )
collect_logger . info ( "user1:广东" )
return HttpResponse ( "OK" )