Python的DEBUG LOG

一直在嵌入式行业,熟悉嵌入式的朋友都很了解嵌入式设备上DEBUG的麻烦,特别是一些缺乏断电工具和没有UI界面的设备。久而久之,开发一个新东西,首先就是要先搞定DEBUG手段。最近写了几个测试的python脚本用于跑些压力测试。找了些Python的DEBUG方法并加以处理,形成了方便使用的DEBUG手段。

其实Python的DEBUG LOG很简单很方便,相当于整辆车都做好了,就等你怎么开车了。而我们在C的嵌入式设备上,DEBUG都几乎需要自己造轮子,造车身。然而在Python中我们只需要import logging就可以了,而且这还是标准模块。无需额外的库。

每次跑LOG都可以生成以时间命令的LOG文件,这样就无需担心文件覆盖,重名,无法确认LOG开始时间等问题。可以参考的代码如下:

import time
import logging

log_filename=r‘LOG\%s_test.log‘%(time.strftime(‘%Y%m%d%H%M%S‘))

logging.basicConfig(level=logging.DEBUG,
format=‘%(asctime)s [line:%(lineno)d] %(levelname)s %(message)s‘,
datefmt=‘%Y.%m.%d %H:%M:%S‘,#datefmt=‘%a, %d %b %Y %H:%M:%S‘,
filename=log_filename,
filemode=‘w‘)

def debug_trace(str):
    print(str)#如果需要在控制台打印的话。
    logging.debug(str)

debug_trace("test")
logging.debug("test")

生成log文件“20190102102228_test.log”,文件中的LOG如:2019.01.02 10:22:28 [line:14] DEBUG test

但是以上的写法会有个问题,lineno将不是我们想要的,一直会是debug_trace中的行号。如果直接使用 logging.debug("test"),则lineno就会期望的实际被调用的位置的行号。

我原来在C嵌入式上的一些习惯,debug时会把当前调用的函数名,行号等打印出来。所以加强版的debug trace就是如下:

 1 import time
 2 import logging
 3 import sys
 4
 5 log_filename=r‘LOG\%s_test.log‘%(time.strftime(‘%Y%m%d%H%M%S‘))
 6
 7 logging.basicConfig(level=logging.DEBUG,
 8 format=‘%(asctime)s %(levelname)s %(message)s‘,
 9 datefmt=‘%Y.%m.%d %H:%M:%S‘,#datefmt=‘%a, %d %b %Y %H:%M:%S‘,
10 filename=log_filename,
11 filemode=‘w‘)
12
13
14 def debug_trace(str):
15     debug_str = sys._getframe().f_back.f_code.co_name+"() "+"Line:"+"%d"%(sys._getframe().f_back.f_lineno)+"   "+str
16     print(debug_str)#如果需要在控制台打印的话。
17     logging.debug(debug_str)
18
19 def main():
20     debug_trace("test")
21
22 main()

这样打出来的LOG就可以是: 2019.01.02 10:41:10 DEBUG main() Line:20   test

原文地址:https://www.cnblogs.com/Wokky/p/10207376.html

时间: 2024-10-14 22:33:57

Python的DEBUG LOG的相关文章

打印函数print与debug.log的区别

public static void print(object message) { Debug.Log(message); } 没看错,实现就是通过Debug.Log来完成的. 所以Print就是Debug.Log的一个简单封装

【Unity游戏开发之二】定制Debug.log输出

环境:Unity开发时会有很多的Debug.log输出测试 问题:最后游戏发布的时候,不希望在Produce发布环境也输出大量的日志,官方目前也没有正统的做法. 解决方法1: 重新封装 将Debug.log重新封装,自己添加开关. using UnityEngine; using System.Collections; public class Debuger { static public bool EnableLog = false; static public void Log(objec

Android如何让真机显示debug log的调试信息

真机默认是不开启debug log调试功能的,以前我一直用模拟器,模拟器默认是开启debug log调试功能的,那么如何让真机开启呢? 我用华为Ascend P6为例: 1.进入拨号界面,输入“*#*#2846579#*#*”进入测试菜单界面. 2.工程菜单->后台设置->Log设置->Log打开. 3.最后会自动重启手机,就好了.

U3D Debug.log的问题

今天在测试有yield有关的问题时,发现Debug.log()是异步输出机制.不一定会在调用后立即执行. 在C++有类似问题:std::cout 也不一定会立即输出,加上"\n"或std::endl可以.而C语言的print则会立即输出. 1 public class rotCube : MonoBehaviour { 2 IEnumerator waitprint(){ 3 for (int i = 0; i < 10000; ++i) 4 Debug.Log ("d

封装 UnityEngine.Debug.Log 为Dll ,游戏发布关闭 Log 减少性能消耗

本文参考雨松Mono的文章: http://www.xuanyusong.com/archives/2782 Mono介绍的是Mac 上Console 编译DLL的方法,本文是在 Win7 系统使用MonoDeveloper 编译. 文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn/ 在游戏发布时,有很多东西需要进行优化 ,消耗性能的东西 能减少就减少. UnityEngine.Debug.Log 是很消耗性能的操作,即使我们

python 实现 math.log(x,base)

python 用闭包实现math.log(x,base) #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys,math import random import pprint def log(n,d): i = 0 status = 0 while True: if d**i==n: status=1 break elif d**i<n<d**(i+1): break i+=1 def test(level=100): if status

【Python】debug工具-pdb(转)

Debug功能对于developer是非常重要的,python提供了相应的模块pdb让你可以在用文本编辑器写脚本的情况下进行debug. pdb是python debugger的简称. 常用的一些命令如下: 命令 用途 break 或 b 设置断点 continue 或 c 继续执行程序 list 或 l 查看当前行的代码段 step 或 s 进入函数 return 或 r 执行代码直到从当前函数返回 exit 或 q 中止并退出 next 或 n 执行下一行 pp 打印变量的值 help 帮助

python的debug神器PySnooper

同事给我推荐了这个调试神器,一直没工夫看,今天看了下. 原文链接: 史上最方便的Python Debug工具|腾讯技术说 体验了下,感觉最好的用法:1.优先逐行调试:2.一些复杂状态处理或者偶现的bug,可以用这个库调试:感觉并不会颠覆传统的调试手段,只是让添加日志更加便利了而已. 但是同事从后台开发的角度给出了他的看法,稍微大型的python项目都只有开发的时候才逐行,服务器他们基本都靠日志,只是客户端习惯了debugger的调试.写个桌面程序,debugger很容易,这个服务就没那么简单了,

python的Debug调试

先打开Shell的Debug-->Debugger调试, 然后点击程序的运行 点击Debug的step按钮查看每一步的结果