1. 程式人生 > >【Django】Django開發中的日誌輸出

【Django】Django開發中的日誌輸出

開發環境:Ubuntu16.04+Django 1.11.9+Python2.7

一:使用自定義函式輸出日誌到log檔案:

import time 
def print_log(log): 
     file_obj = open('/tmp/filename.log', 'a+')
     log_time = time.strftime(
        '[%Y-%m-%d %H:%M:%S]',
        time.localtime(
            time.time()))    # 轉化時間格式
     file_obj.write("%s\n" % (str(log)))
     file_obj.close()        # 記得close()

這樣的在需要輸出的時候,呼叫print_log()就可以輸出資訊到指定的檔案了.缺點是不清楚是哪個檔案哪個函式輸出的資訊更也不知道是來自哪一行輸出.

獲取到函式資訊

獲取檔名,檔案路徑,所在函式名,所在行

第二個’#’後面為實測輸出結果,Linux也測試過

import sys
import os
import time
def get_function_info():
    print(os.path.basename(sys.argv[0]).split(".")[0])     #不帶字尾的所在檔名  # 關於函式
    print (os.path.basename(sys.argv[0
]))          #帶字尾的所在檔名 # 關於函式.py print (sys._getframe().f_code.co_filename)        # 函式路徑 # E:/Pycharm/tcp/關於函式.py print (sys._getframe().f_code.co_name)         # 所在函式名 # get_function_info print (sys._getframe().f_lineno)          # 所在行 # 23 get_function_info()

使用上面的方法可以獲取到檔名,路徑,函式名,所在行的行號

import sys
import os
import time
def get_function_info():
    file_name = os.path.basename(sys.argv[0]).split(".")[0]       
    os.path.basename(sys.argv[0])  
    sys._getframe().f_code.co_filename 
    function_name = sys._getframe().f_code.co_name 
    function_num = sys._getframe().f_lineno    
    return file_name,function_name,function_num

 def print_log(log):  
     file_obj = open('/tmp/filename.log', 'a+')
     log_time = time.strftime(
        '[%Y-%m-%d %H:%M:%S]',
        time.localtime(
            time.time()))
     file_name,function_name, function_num= get_function_info()
     file_obj.write("%s %s %s [line:%s] log %s\n" % (log_time,file_name, function_name,function_num,str(log)))
     file_obj.close()      

這樣在理論上是能獲取到想得到的資訊的.

可是這些在django實際開發使用的時候,因為print_log()是單獨定義的函式,在被呼叫的時候,輸出的函式名都是manage.py,行數也是固定的,不滿足實際需要的.

二:使用logging:

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:  %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', 
 filename='/tmp/filename.log',
filemode='a')

上面我使用的配置資訊.具體引數意思如下:

  1. 第一行:日誌等級
  2. 第二行:輸出格式,message是接收的引數
  3. 第三行:時間格式
  4. 第四行:輸出的log文件路徑
  5. 第五行:表示追加

如下使用即可.

import logging
logging.debug(log)

logging.debug(log)中log表示需要輸出的log資訊,這樣會輸出所有的資訊

logging的日誌級別:

critical > error > warning > info > debug

所以debug能輸出所有的資訊,特別是開發階段,需要所有資訊.

format引數中可能用到的格式化資訊:

  1. %(filename)s  呼叫日誌輸出函式的模組的檔名
  2. %(asctime)s   字串形式的當前時間,有預設格式.
  3. %(lineno)d   呼叫日誌輸出函式的語句所在的程式碼行
  4. %(levelname)s  文字形式的日誌級別