[Django]Django开发中的日志输出

Posted shiguangyishiyongbuhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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
" % (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
" % (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   文本形式的日志级别


以上是关于[Django]Django开发中的日志输出的主要内容,如果未能解决你的问题,请参考以下文章

Django的日志如何配置?

Django日志配配置

Django日志配置

django 1.3 用于在开发环境中进行调试的日志记录

Django 中的 Python 日志记录

如何将 Django 标准输出转发到 Elastic Beanstalk 日志?