[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   文本形式的日志级别

原文地址:https://www.cnblogs.com/shiguangyishiyongbuhui/p/9248365.html

时间: 2024-10-09 18:40:19

[Django]Django开发中的日志输出的相关文章

Django框架开发中避免表单重复提交

Form表单做为web2.0时代的重要角色,也是我们与web网站进行数据交互的重要渠道,但是大家在web网站开发过程中,都会遇到一个问题,那就是如何避免表单重复提交,我们可不确定用户可在提交了一个表单后,是否有足够的耐心等待我们的程序加载完成,如果此时用户不耐烦的在前台重复刷新页面,那么就会造成数据重复提交.信息不准确,因此我们在程序设计时一定要规避这样的问题,接下来介绍一下在Django框架开发中如何避免此问题. 首先说明一下Http协议中两种非常常见的方法GET和POST. 1.GET方法往

移动开发中的日志管理

在Android移动开发中,日志为我们提供了很多便利.但是应用程序发布后又不想让应用程序输出日志信息,就可以设计一个日志开关对应用中的日志做统一的管理.下面这个简单的日志类就完成了这样的功能,有需要的朋友可以参考. package com.hitech.jni4cppdemo.utils; public class Log { // 应用名称 private static final String TAG = "ResXtrojan"; // 日志开关 private static b

9 个技巧,解决 K8s 中的日志输出问题

作者 | 元乙??阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想把这些年积累的经验以文章的形式发出来,让看到文章的同学少走弯路.K8s 日志系列文章内容偏向落地实操以及经验分享,且内容会随着技术的迭代而不定期更新,本文为该系列文章的第 3 篇. 第一篇:<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?> 第二篇:<一文看懂 K8s 日志系统设计

JAVA中自定义日志输出到指定文件

虽然JAVA日志包提供的功能已经很方便,但是假如我们有新的需求如:将日志文件保存到我们希望的位置并在日志文件名中添加日期且保存指定时间内的日志文件:按照自己希望的格式输出日志内容.对于这些需求我们只要扩展java.util.logging.StreamHandler(Handler的子类),java.util.logging.Formatter创建自定义的处理器及格式化器即可以实现.下面是个例子,它分别创建了Handler及Formatter的子类,以便实现将日志文件保存到我们需要的位置,及在日

java 组件开发中的日志记录问题

今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报错.如果你打入可能会和使用该jar包的项目发生冲突,因为别人可能已经引入了相关jar包. 自己可以根据要求来定: 如果不打就需要把jar和pom文件都提供给需求提出者. 如果需要可以使用maven 插件 maven-assembly-plugin. <plugin> <groupId>

iOS中 加强日志输出 开发技术总结

对于那些做后端开发的工程师来说,看LOG解Bug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多人并没有这个意识,查Bug时总是一遍一遍的试图重现,试图调试,特别是对一些不太容易重现的Bug经常焦头烂额.而且iOS的异常机制比较复杂,Objective-C的语言驾驭也需要一定的功力,做出来的应用有时候挺容易产生崩溃闪退.一遍一遍的用XCode取应用崩溃记录.解析符号,通常不胜其烦,有时还对着解析出来的调用栈发呆,因为程序当时的内部状态常常难以看明白,只能去猜测. 对于真机,日志没法

那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传

一.上传图片并在前端展示 为了避免前端整体刷新,我们采用ajax+iframe(兼容所有浏览器)上传,这样用户上传之后就可以立即看到图片: 上传前: 上传后: 前端部分html: <form style="display: inline-block" id="upload_img_form" name="form" action="/upload/" method="POST" enctype=&qu

理解正确的日志输出级别

原文链接:http://macrochen.iteye.com/blog/1399082 很多程序员都忽略了日志输出级别, 甚至不知道如何指定日志的输出级别. 相对于System.out来说, 日志框架有两个最大的优点就是可以指定输出类别(category)和级别(level). 对于日志输出级别来说, 下面是我们应该记住的一些原则:ERROR:系统发生了严重的错误, 必须马上进行处理, 否则系统将无法继续运行. 比如, NPE, 数据库不可用等. WARN:系统能继续运行, 但是必须引起关注.

log4j日志输出使用_1

转自https://www.cnblogs.com/sky230/p/5759831.html Log4j是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优先级.日志信息的输出目的地以及日志信息的输出格式.Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息.很多程序员经常会使用System.out.println语句输出某个变量值的方法进行调试.这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.