django配置文件详解_pycharm配置python

django配置文件详解_pycharm配置python前言django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪、错误代码之类的详细信息。log

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

  django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪、错误代码之类的详细信息。
  logging主要由4部分组成:LoggersHandlersFiltersFormatters
 

settings中完整的配置

如果想自定义配置日志信息,我们可以在settings.py文件中配置,那配置的格式是怎么样的呢?我们可以通过from django.utils.log import DEFAULT_LOGGING查看Django中默认的日志配置信息,然后依葫芦画瓢即可

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  
    'incremental':True,
    'filters': {},
    'formatters': {},
    'handlers': {},
    'loggers': {}
}

上述是默认的日志配置信息的格式,我们依次介绍

  • version:配置信息的版本
  • disable_existing_loggers:默认为True,True:设置已存在的logger失效。False:让已存在的logger不失效,保证日志信息完整。一般情况下设置为False
  • incremental:默认为False。True:是将配置解释为现有配置的增量。False:配置会覆盖已有默认配置。一般此项不用配置
  • filter:过滤器
  • formatters:格式器
  • handlers:处理器
  • loggers:日志器
     

Formatters

  日志记录最终需要呈现为文本,formatter程序描述该文本的确切格式。formatter通常由包含LogRecord属性的Python格式化字符串组成 ; 但是,也可以编写自定义formatter来实现特定的格式化行为。
 

1.settings中配置:

3个参数(具体看后面的Formatter类):

  • ():指定格式器的类,不指定的话,默认使用logging.Formattr。一般用默认即可
  • format:格式化字符串
  • style:样式选择
  • datefmt:日期格式化字符串,使用的是python中时间日期格式化符号

案例

LOGGING = {
    'formatters': {
        'verbose': {
            '()': 'logging.Formatter',
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    }
}

配置了2个格式器:

  • simple:只输出简单的:日志级别名称 日志消息
  • verbose:输出:日志级别名称 生成日志消息的时间 模块 进程 线程 日志消息
     

2.内置格式器

Formatter:默认格式器,初始化参数:fmt=None, datefmt=None, style='%'

  • fmt:格式化字符串,指定输出格式,如:'{levelname}{process:d}{message}'
  • datefmt:日期格式化字符串,为None则使用ISO8601格式化,如:'2010-01-01 08:03:26,870'
  • style:’%’,'{‘ 或 ‘$’,3选一:
    • ‘%’:默认是这个,使用python%格式化 , 如: %(levelname)s
    • ‘{‘:使用 str.format格式化(django框架使用这个), 如:{levelname}
    • ‘$’:使用类string.Template格式化,如:\$levelname

格式化字符串的种类

%(name)s:记录器logger的名称
%(levelno)s:日志级别对应的数字
%(levelname)s:日志级别名称
%(pathname)s:日志记录调用的源文件的完整路径
%(filename)s:日志记录调用的源文件名
%(module)s:模块名
%(lineno)d:日志调用的行数
%(funcName)s:函数名
%(created)f:日志创建时间,time.time()
%(asctime)s:日志创建时间,文本类型
%(msecs)d:日志创建时间的毫秒部分
%(relativeCreated)d:日志创建时间 - 加载日志模块的时间 的 毫秒数
%(thread)d:线程ID
%(threadName)s:线程名
%(process)d:进程ID
%(processName)s:进程名
%(message)s:日志消息

 

Filters

过滤器filter用于提供对日志记录从logger传递到handler的附加控制
​默认情况下,loggerhandler将处理满足日志级别要求的任何日志消息,但是,通过安装filter,可以在日志记录过程中添加其他条件。例如,可以安装仅允许ERROR级别 来自特定源的消息的filter。
​filter还可用于在发出之前修改日志记录。例如,如果满足一组特定条件,可以编写一个过滤器,将ERROR日志记录降级为WARNING记录。
​filter可以安装在loggerhandler上; 可以在链中使用多个filter来执行多个过滤操作。
 

1.settings中配置

LOGGING = {
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
}

配置了2个过滤器

  • require_debug_false:使用类:RequireDebugFalse
  • require_debug_true:使用类:RequireDebugTrue
     

Handlers

  这个类是确定logger中消息发生的引擎程序,描述特定的日志记录行为,譬如控制台打印、写入日志文件、通过网络进行发送等
  与logger一样,handler也具有日志级别,如果日志记录的日志级别未达到或超过handler的级别,则handler将忽略该消息。
  一个logger可以有多个handler,每个handler可以有不同的日志级别和记录方法
 

1.settings中配置

4个参数(如下),加上对应class类的初始化参数

  • class(必需):处理程序类的名称
  • level(可选的):处理程序的级别
  • formatter(可选的):处理程序的格式化程序
  • filters(可选的):处理程序的过滤器的列表
     

2.内置处理器

  1. python3的logging中的handler
    • StreamHandler:输出到stream,未指定则使用sys.stderr输出到控制台

    • FileHandler:继承自StreamHandler,输出到文件,默认情况下,文件无限增长
      初始化参数:filename,mode ='a',encoding = None,delay = False
      delay如果为True,那么会延迟到第一次调用emit写入数据时才打开文件

        'handlers': {
                'file': {
                    'level': 'DEBUG',
                    'class': 'logging.FileHandler',
                    'filename': '/path/to/django/app.log', #参数配置在这里,多个参数按顺序继续配置即可, 如果要添加encoding,那么在下面添加 encoding: 'utf-8' 即可
                },
            }
      
    • RotatingFileHandler:自动按大小切分的log文件(常用)
      初始化参数:filename,mode ='a',maxBytes = 0,backupCount = 0,encoding = None,delay = False
      maxBytes:最大字节数,超过时创建新的日志文件,如果backupCountmaxBytes有一个为0,那么就一直使用一个文件
      backupCount:最大文件个数,新文件的扩展名是指定的文件后加序号”.1″等,譬如:backupCount=5,基础文件名为:app.log,那么达到指定maxBytes之后,会关闭文件app.log,将app.log重命名为app.log.1,如果app.log.1存在,那么就顺推,先将 app.log.1重命名为app.log.2,再将现在的app.log命名为app.log.1,最大创建到app.log.5(旧的app.log.5会被删除),然后重新创建app.log文件进行日志写入,也就是永远只会对app.log文件进行写入。

    • TimedRotatingFileHandler:按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S
      初始化参数:filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None
      when:时间间隔类型,不区分大小写

        'S':秒
        'M':分钟
        'H':小时
        'D':天
        'W0'-'W6':星期几(0 = 星期一)
        'midnight':如果atTime未指定,则在 0点0分0秒 翻转,否则在atTime时间翻转
      

      interval:间隔的数值
      backupCount: 文件个数
      encoding:编码
      delay:True是写入文件时才打开文件,默认False,实例化时即打开文件
      utc:False则使用当地时间,True则使用UTC时间
      atTime:必须是datetime.time实例,指定文件第一次切分的时间,when设置为S,M,H,D时,该设置会被忽略

    • SMTPHandler:通过email发送日志记录消息
      初始化参数:mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=5.0
      mailhost:发件人邮箱服务器地址(默认25端口)或地址和指定端口的元组,如:(‘smtp.163.com’, 25)
      fromaddr:发件人邮箱
      toaddrs:收件人邮箱列表
      subject:邮件标题
      credentials:如果邮箱服务器需要登录,则传递(username, password)元组
      secure:使用TLS加密协议
       

Loggers

 

1.settings中配置

通过在settings中配置LOGGING配置项实现日志配置,共4个配置项(都是可选的,不过一般会指定handler):

  • level:指定记录日志的级别,没有配置则处理所有级别的日子
  • propagate:设置该记录器的日志是否传播到父记录器,不设置则是True
  • filters:指定过滤器列表
  • handlers:指定处理器列表

示例如下:

LOGGING = {
    'version': 1,  # 固定值,现在只有这一个版本
    'disable_existing_loggers': False, # 设置已存在的logger不失效
    'loggers': {
        '': {
            'handlers': ['console'],
        },
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

配置了4个 logger, 分别对应2个不同的handler(console输出日志到控制台,mail_admins输出日志到邮件)

  • ”:默认的记录器,不指定特定名称,那么就是使用这个记录器,没有配置level,那么就是处理所有级别的日志,传递所有级别的日志到console控制器
  • django:传递所有级别的日志到console控制器
  • django.request:django记录器的子记录器,处理ERROR级别及以上的日志,propagate设置为 False,表明不传播日志给 “django”,该logger传递日志到mail_admins控制器
  • myproject.custom:处理INFO级别及以上的日志,应用了一个 special 的过滤器来过滤日志,传递日志到2个控制器([‘console’, ‘mail_admins’])处理
     

注意
django框架有个默认的配置:DEFAULT_LOGGING,一旦配置了自己的LOGGING后,那么所有的默认的LOGGER全部都失效,失效不等于没有记录器了,而是说记录器不起作用了,即不会记录日志,也不会将日志传播给父记录器。因此你应该非常小心使用,因为你会感觉你丢了日志一样,可以手动设置同名的logger实现覆盖,如:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        #  覆盖了 django 记录器,所有django的记录日志最后全部写入到文件中
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

 

2.django内置的logger

  内置的logger在django项目运行中会自动记录日志,与我们手动创建的logger的执行没有关系,除非我们也创建相同的logger
django框架调用的地方在:django.core.servers.basehttp中(如WSGIRequestHandler)

  • django:django框架中所有消息的记录器,一般使用它的子记录器,而不是它发布消息,因为默认情况下子记录器的日志会传播到根记录器django,除非设置 ‘propagate’: False
  • django.request:记录与请求处理相关的消息。5XX响应作为ERROR消息; 4XX响应作为WARNING消息引发。记录到django.security记录器的请求不会记录到django.request

发送给此记录器的消息具有以下额外上下文:

  • status_code:与请求关联的HTTP响应代码

  • request:生成日志消息的请求对象。

  • django.server:记录与runserver命令调用的服务器接收的请求的处理相关的消息。5XX响应记录为ERROR 消息,4XX响应记录为WARNING消息,其他所有响应记录为INFO
    发送给此记录器的消息具有以下额外上下文:

    • status_code:与请求关联的HTTP响应代码
    • request:生成日志消息的请求对象。
  • django.template:记录与模板呈现相关的消息

  • django.db.backends:记录代码和数据库交互相关的消息

  • django.security.*:记录任何SuspiciousOperation和其他安全相关错误(django.security.csrf )的消息

  • django.db.backends.schema:记录数据库迁移过程中的日志,但是不记录执行的查询SQL语句等,发送给此记录器的消息具有以下额外上下文:

    • sql:已执行的SQL语句。
    • params:SQL调用中使用的参数

 

实战案例

如果你对以上的介绍觉得写得很乱又复杂,没关系,下面直接教你在项目中如何使用,基本就3种用法

  • 通过文件分割日志
  • 通过时间分割日志
  • 通过邮箱发送日志
     

案例1:通过文件分割日志

首先配置settings.py中的logging,代码如下

BASE_LOG_DIR = os.path.join(BASE_DIR, 'log')

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 设置已存在的logger不失效
    'filters': {},
    'formatters': {
        'standard': {
            'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d:%(funcName)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple':{
            'format':'[%(asctime)s][%(levelname)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_LOG_DIR, 'debug.log'),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'default'],
            'level': 'INFO',
            'propagate': True
        },
    },
}

接下来在views.pyurls.py函数中写入函数,代码如下

# urls.py
urlpatterns = [
    path('', views.index, name="index"),
]

# views.py
logger = logging.getLogger('django')
def index(request):
    logger.debug('debug 测试')
    logger.info('info 测试')
    logger.warning('warning 测试')
    logger.error('error 测试')
    return HttpResponse('success')

然后我们访问127.0.0.1/logging/,我们可以看到控制台的代码

Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[2021-05-30 15:03:09][INFO]:info 测试
[2021-05-30 15:03:09][WARNING]:warning 测试
[2021-05-30 15:03:09][ERROR]:error 测试
[2021-05-30 15:03:09][INFO]:"GET /logging/ HTTP/1.1" 200 7

这是因为我们在django记录器中配置了console控制器,格式要求也是符合我们所写的,接着查看项目的log目录下会新增了一个debug.log这样一个日志文件,文件内容如下

[2021-05-30 15:03:04][INFO][autoreload.py:578:run_with_reloader]:Watching for file changes with StatReloader
[2021-05-30 15:03:09][INFO][views.py:12:index]:info 测试
[2021-05-30 15:03:09][WARNING][views.py:13:index]:warning 测试
[2021-05-30 15:03:09][ERROR][views.py:14:index]:error 测试
[2021-05-30 15:03:09][INFO][basehttp.py:154:log_message]:"GET /logging/ HTTP/1.1" 200 7

debug.log日志输出格式更加详细,这是因为我们在default控制器中,使用的standard格式器。

 
总结:以上就是我们最常用的一种日志配置—文件日志,当中的细节例如格式啊等等的可以自己更改
 

案例2:时间分割日志

代码设置如下:

'time_handler': {
      'level': 'INFO',
      'class': 'logging.handlers.TimedRotatingFileHandler',
      'filename': os.path.join(BASE_LOG_DIR, "time.log"),
      'when': 'S',
      'interval': 10,
      'backupCount': 5,
      'formatter': 'standard',
      'encoding': 'utf-8',
  }

以上设置为间隔10秒,生成一个日志文件
 

案例3:日志邮箱发送

代码设置如下:

'email_handler': {
      'level': 'ERROR',
      'class': 'logging.handlers.SMTPHandler',
      'formatter': 'standard',
      'mailhost': ('smtp.163.com', 25),
      'fromaddr': 'xxxx@163.com',
      'toaddrs': ['xxx@qq.com'],
      'subject': 'test',
      'credentials': ('邮箱用户名', '邮箱密码'),
  },

接下来出现ERROR级别的日志,就会发送邮件,如果你出现报错代码为550,那么就是你邮箱的权限没有开通,到邮箱的设置中开启SMTP服务即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/166147.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 西门子scl语言编程教程_西门子scl编程

    西门子scl语言编程教程_西门子scl编程《在西门子PLC中使用SCL语言编程的技巧》由会员分享,可在线阅读,更多相关《在西门子PLC中使用SCL语言编程的技巧(6页珍藏版)》请在人人文库网上搜索。1、在西门子PLC中使用SCL语言编程的技巧前言:两年半前我就在工控网上发表了有关SCL编程的知识#lt;#lt;在S型PLC中使用高级语言编程#gt;#gt;,但发表完后,即使我自己都从没有把任何使用SCL编写的程序用到实际控制中,当时的感觉…

  • linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)

    linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令:q!Vi放弃所作修改而直接退到shell下,则Vi在显示窗口的状态行给出提示信息:Fileexists(use!tooverride)此时,在末行模式下,。在末行模式下,若在用此命令退出Vi时,返回到shell;若当前编辑的文件没被修改过,输入命令:wqVi将先保存文件,输入命令:wVi保存当前编辑…

  • CSS画三角形及其原理

    CSS画三角形及其原理本文转自https://blog.csdn.net/pengjunlee/article/details/53002553搜索网络之后发现三角形可以通过以下CSS代码实现:#triangle_bottom{height:0px;width:0px;border-left:20pxsolidtransparent;border-right:20pxsolidtransparent…

  • Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解

    Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解一、ABI是什么ABI是ApplicationBinaryInterface的缩写。不同Android手机使用不同的CPU,因此支持不同的指令集。CPU与指令集的每种组合都有其自己的应用二进制界面(或ABI)。ABI可以非常精确地定义应用的机器代码在运行时如何与系统交互。您必须为应用要使用的每个CPU架构指定ABI。典型的ABI包含以下信息:机…

  • 少儿编程是学什么的(小学编程是学些什么东西)

    前言  我是一位从业十年的程序员,也是一位程序员爸爸。十年来,一直coding,从未停歇。既做过传统行业的软件,也做过移动互联网产品,甚至还曾在年少时,闯荡过幼教产品的创业大潮。作为程序员爸爸(或许应该叫工程师爸爸,换个称呼可以让孩子更崇拜),我时常在想我家的小朋友是否应该学习或者接触一下编程?那么说到编程,就必然需要先理解一下编程是什么?少儿编程又是什么?对于前者,我期望从实践者的视角作出我的…

  • 如何查看某个端口被谁占用

    如何查看某个端口被谁占用

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号