運維開發筆記整理-django日誌配置

                運維開發筆記整理-django日誌配置html

                                       做者:尹正傑 python

版權聲明:原創做品,謝絕轉載!不然將追究法律責任。mysql

 

 

一.Django日誌sql

  Django使用python內建的logging模塊打印日誌,Python的logging配置由四個部分組成:數據庫

1>.記錄器(Logger)django

2>.處理程序(Handler)瀏覽器

3>.過濾器(Filter)安全

4>.格式化(Formatter)服務器

  更多關於logging模塊的配置信息,詳情請參考:https://yiyibooks.cn/xx/python_352/library/logging.html網絡

 

二.記錄器(Logger)

1>.Logger爲日誌系統的入口。每一個logger命名都是bucket,你能夠向這個bucket寫入須要處理的消息;

2>.每一個logger都有一個日誌級別。日誌級別表示該logger將要處理的消息的嚴重性。Python定義如下幾種日誌級別:

  DEBUG:
      用於調試目的的底層系統信息   INFO:
      普通的系統信息   WARNING:
      表示出現一個較小的問題   ERROR:
      表示出現一個較大的問題   CRITICAL:
      表示出現一個致命的問題

3>.寫入logger的每條消息都是一條日誌。每條日誌也具備一個日誌級別,它表示對應的消息的嚴重性。每一個日誌記錄還能夠包含描述正在打印的時間的元信息;

4>.當一條消息傳遞給logger是,消息的日誌級別將與logger的日誌級別進行比較。若是消息的日誌級別大雨等於logger的日誌級別,該消息將會往下繼續處理。若是小雨,該消息將被忽略;

5>.Logger一旦決定消息須要處理,它將傳遞消息給一個Handler;

 

三.logger的日誌級別

級別         值       描述
CRITICAL     
50     關鍵錯誤/消息
ERROR       
40     錯誤
WARNING       
30     警告消息
INFO        
20     通知消息
DEBGU        
10     調試
NOTSET        0      無級別

 

四.Logger配置

   logger對應的值是個字典,其每個鍵都是logger的名字,每個值又是個字典,描述瞭如何配置對應的Logger實力。

level(可選的): logger的級別。 propagate(可選的): logger的傳播設置。 filters(可選的): logger的filter的標識符的列表。 handllers(可選的): logger的handler的標識符的列表。
LOGGING = { 'loggers': { 'devops': { 'handlers': ['file_handler', 'console_handler'], 'level': 'DEBUG', }, }, }
Logger配置示例

  想要了解更多logger,詳情請參考:https://yiyibooks.cn/xx/python_352/library/logging.html#logger-objects

 

五.處理程序(Handler)

1>.Handler決定如何處理logger中的每條消息。它表示一個特定的日誌行爲,例如將消息寫到屏幕上,寫到文件中或者寫到網絡socket。

2>.與logger同樣,handler也有一個日誌級別。若是消息的日誌級別小雨handler的級別,handler將忽略該消息。

3>.Logger能夠有多個handler,而每一個handler能夠有不一樣的日誌級別。利用這種方式,能夠根據消息的重要性提供不一樣形式的處理。

"handlers": { "file": { "level": "DEBUG", "class": "logging.handlers.TimedRotatingFileHandler", "filename": os.path.join(BASE_DIR, "logs", "debug.log"), "when":"S", "interval":5, "formatter": "default" }, },
Handler示例

  想要了解更多handler,詳情請參考:https://yiyibooks.cn/xx/python_352/library/logging.html#handler-objects

  想要了解更多loggin-handler,詳情請參考:https://yiyibooks.cn/xx/python_352/library/logging.handlers.html

 

六.過濾器(Filters)

1>.Filter用於對從logger傳遞給handler的日誌記錄進行額外的控制。

2>.默認狀況下,知足日誌級別的任何消息都將被處理。經過安裝一個filter,你能夠對日誌處理添加額外的條件。例如,你能夠安裝一個filter,只容許處理來自特定源的ERROR消息;

3>.Filters還能夠用於修改將要處理的日誌記錄的優先級。例如,若是日誌記錄知足特定的條件,你能夠編寫一個filter將日誌記錄從ERROR將爲WARNING(我想說然而並無什麼亂用!);

4>.Filters能夠安裝在logger是那個或者多個handler上;多個filter能夠串聯起來實現多層filter行爲;

 

七.格式化(Formatters)

  日誌記錄須要轉換成文本。Formatter表示文本的格式。Fomatter一般由包含日誌記錄屬性的Python格式字符串組成;你也能夠編寫自定義的fomatter來實現本身的格式。

LOGGING = { 'formatters': { ‘devops’:{ 'format': '%(asctime)s - %(pathname)s:%(lineno)d[%(levelname)s] - %(message)s' } 'simple': { 'format': '%(asctime)s %(levelname)s %(message)s' }, }, } 
Formatters的案例展現

  更多formatters,詳情請參考:https://yiyibooks.cn/xx/python_352/library/logging.html#formatter-objects 

Format日誌消息格式     描述 %(name)s     記錄器的名稱 %(levelno)s 數字形式的日誌記錄級別 %(levelname)s 日誌記錄級別的文本名稱 %(filename)s  執行日誌記錄調用的源文件的文件名稱 %(pathname)s  執行日誌記錄調用的源文件的路徑名稱 %(funcName)s   執行日誌記錄調用的函數名稱 %(module)s    執行日誌記錄調用的模塊名稱 %(lineno)s    執行日誌記錄調用的行號 %(created)s   執行日誌記錄的時間 %(asctime)s   日期和時間 %(msecs)s    毫秒部分 %(thread)s    線程ID %(threadName)s    線程名稱 %(process)s   進程ID %(message)s                              記錄的消息 

 

八.Django內置logger

1>.django

  獲取全部日誌。

2>.django.request

  處理與請求相關的日誌,5xx響應報出error,400報出WARNING日誌。

3>.django.db.backends

  處理與數據庫之間的交互的日誌。

4>.django.security.*

   處理與安全相關的日誌。

5>.django.db.backends.schemea

  處理數據庫遷移時的日誌。

  想要了解更多Django內置的logger詳情請參考:https://docs.djangoproject.com/en/1.11/topics/logging/#id3

 

九.使用python的logging模塊案例展現

"""DevOps URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^dashboard/",include("dashboard.urls")) ]
DevOps中的urls.py文件內容 
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/

from django.conf.urls import url from . import views urlpatterns = [ url(r"^login/",views.LoginView.as_view()), url(r"^index/", views.MyPageView.as_view()), ]
dashboard中的urls.py文件內容
""" Django settings for DevOps project. Generated by 'django-admin startproject' using Django 1.11.11. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """

import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'fobwai!6%)9$$-*+&5v9-s_p3-e5=5jb9%7ko131o_g&eu8d+@'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = ["*"] # Application definition
 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'dashboard.apps.DashboardConfig', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'DevOps.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'DevOps.wsgi.application'


# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',  # 鏈接的數據庫類型
          'HOST': '127.0.0.1',                      # 鏈接數據庫的地址
          'PORT': 3306,                             # 端口
          'NAME': "devops",                         # 數據庫名稱
          'USER': 'root',                          # 用戶
          'PASSWORD': 'yinzhengjie'               # 密碼
 } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
 AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/
 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/
 STATIC_URL = '/static/' LOGGING = { "version": 1, 'disable_existing_loggers': False,          #通常狀況下設置爲False,表示不由用Django的默認配置

    'formatters': { 'devops': { 'format': '[%(asctime)s] [%(process)d] [%(thread)d] [%(filename)16s:%(lineno)4d] [%(levelname)-6s] %(message)s' }, 'simple': { 'format': '%(asctime)s %(levelname)s %(message)s' }, 'default': { 'format': '%(asctime)s %(levelname)s %(pathname)s [ %(lineno)s] %(message)s', "datefmt":"%Y-%m-%d %H:%M:%S" } }, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "simple" }, "file": { "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "django.log"), "formatter": "default" }, }, "loggers":{ "yinzhnegjie-devops": { "level": "DEBUG",                           #配置日誌級別
            "handlers": ["console","file"],            #指定具體的對象去寫
            'propagate': False,                         #是否向上傳播日誌
 }, }, }
DevOps中的settings.py文件內容

  dashboard的APP對應的views.py視圖函數編寫的代碼以下:

#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/

from django.http import HttpResponse,JsonResponse from django.shortcuts import render from django.views import View from django.contrib.auth.models import User import logging # 注意,下面的「yinzhnegjie-devops」字符串摘自「setting.py」中LOGGING對應的loggers所屬的value值。換句話說,就是這個字符串必須在setting.py中定義!
logger = logging.getLogger("yinzhnegjie-devops") class LoginView(View): def get(self,request): return render(request,"login.html") def post(self,request): print("調用了POST方法!") return HttpResponse("post...") class MyPageView(View): def get(self,request,*args,**kwargs): #咱們在代碼中寫入日誌
        logger.debug("這是第一條日誌") #定義每一個頁碼顯示信息的條數
        Number_of_per_page = 10
        try: #獲取到用戶傳遞過來的查詢頁碼
            page = int(request.GET.get("page",1)) except: #若是用戶沒有傳遞要查詢的頁碼,咱們這裏給其設置一個默認值1,即顯示第一頁。
            page = 1

        #定義查詢的起始位置
        end = page * 10 start = end - 10

        #定義查詢的語句,注意這裏並無去數據庫直接查詢語句,這裏只是定義好了要查詢的SQL語句
        queryset = User.objects.all()[start:end] #觸發SQL語句,並將查詢的結果轉換成JSON格式
        data = list(queryset.values("id","username","email")) return JsonResponse(data,safe=False)

  訪問瀏覽器,查看對應的服務器URL配置,以下圖所示:

 

十.使用Django內置的logger案例展現

"""DevOps URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^dashboard/",include("dashboard.urls")) ]
DevOps中的urls.py文件內容
""" Django settings for DevOps project. Generated by 'django-admin startproject' using Django 1.11.11. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """

import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'fobwai!6%)9$$-*+&5v9-s_p3-e5=5jb9%7ko131o_g&eu8d+@'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True ALLOWED_HOSTS = ["*"] # Application definition
 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'dashboard.apps.DashboardConfig', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'DevOps.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'DevOps.wsgi.application'


# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',  # 鏈接的數據庫類型
          'HOST': '127.0.0.1',                      # 鏈接數據庫的地址
          'PORT': 3306,                             # 端口
          'NAME': "devops",                         # 數據庫名稱
          'USER': 'root',                          # 用戶
          'PASSWORD': 'yinzhengjie'               # 密碼
 } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
 AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/
 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/
 STATIC_URL = '/static/' LOGGING = { "version": 1, 'disable_existing_loggers': False,          #通常狀況下設置爲False,表示不由用Django的默認配置

    'formatters': { 'devops': { 'format': '[%(asctime)s] [%(process)d] [%(thread)d] [%(filename)16s:%(lineno)4d] [%(levelname)-6s] %(message)s' }, 'simple': { 'format': '%(asctime)s %(message)s' }, 'default': { 'format': '%(asctime)s %(name)s %(levelno)s %(levelname)s %(message)s', "datefmt":"%Y-%m-%d %H:%M:%S" } }, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "simple" }, "file": { "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "debug.log"), "formatter": "default" }, "request":{ "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "request.log"), "formatter": "default" }, "server": { "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "server.log"), "formatter": "default" }, "root": { "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "root.log"), "formatter": "default" }, "db_backends":{ "level": "DEBUG", "class": "logging.FileHandler", "filename": os.path.join(BASE_DIR, "logs", "db_backends.log"), "formatter": "default" } }, "loggers":{ "yinzhnegjie-devops": { "level": "DEBUG",                           #配置日誌級別
            "handlers": ["console","file"],            #指定具體的對象去寫
            'propagate': False,                         #是否向上傳播日誌
 }, "django":{ "level": "DEBUG", "handlers": [ "console","file"], 'propagate': False, }, "django.request": { "level": "DEBUG", "handlers": ["request"], 'propagate': False, }, "django.sever": { "level": "DEBUG", "handlers": ["server"], 'propagate': False, }, "django.db.backends":{ "level": "DEBUG", "handlers": ["db_backends"], 'propagate': False, } }, #定義本身的日誌,咱們須要下級的 'propagate'的值設置爲False。
     "root": { "level": "DEBUG", "handlers": ["root"], }, }
DevOps中的settings.py文件內容
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/

from django.conf.urls import url from . import views urlpatterns = [ url(r"^login/",views.LoginView.as_view()), url(r"^index/", views.MyPageView.as_view()), ]
dashboard中的urls.py文件內容

   dashboard的APP對應的views.py視圖函數編寫的代碼以下:

#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/

from django.http import HttpResponse,JsonResponse from django.shortcuts import render from django.views import View from django.contrib.auth.models import User import logging # 定義logger的名字,默認狀況下咱們都會寫成「__name__」,表示當前模塊或者當前文件的相對路徑。
logger = logging.getLogger(__name__) class LoginView(View): def get(self,request): return render(request,"login.html") def post(self,request): print("調用了POST方法!") return HttpResponse("post...") class MyPageView(View): def get(self,request,*args,**kwargs): #咱們在代碼中寫入日誌
        logger.debug("這是第一條日誌!") #定義每一個頁碼顯示信息的條數
        Number_of_per_page = 10
        try: #獲取到用戶傳遞過來的查詢頁碼
            page = int(request.GET.get("page",1)) except: #若是用戶沒有傳遞要查詢的頁碼,咱們這裏給其設置一個默認值1,即顯示第一頁。
            page = 1

        #定義查詢的起始位置
        end = page * 10 start = end - 10 logger.warning("再來一條日誌!") #定義查詢的語句,注意這裏並無去數據庫直接查詢語句,這裏只是定義好了要查詢的SQL語句
        queryset = User.objects.all()[start:end] #觸發SQL語句,並將查詢的結果轉換成JSON格式
        data = list(queryset.values("id","username","email")) return JsonResponse(data,safe=False)

  訪問瀏覽器,查看對應的服務器URL配置,以下圖所示:

相關文章
相關標籤/搜索