Python 日志打印模块

Posted 阿布先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 日志打印模块相关的知识,希望对你有一定的参考价值。

1 logging模块简介

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  2. print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

 

2 logging模块使用

2.1 基本使用

配置logging基本的设置,然后在控制台输出日志,

 

1 import logging
2 logging.basicConfig(level = logging.INFO,format = %(asctime)s - %(name)s - %(levelname)s - %(message)s)
3 logger = logging.getLogger(__name__)
4 
5 logger.info("Start print log")
6 logger.debug("Do something")
7 logger.warning("Something maybe fail.")
8 logger.info("Finish")

 

logging中可以选择很多消息级别,如debug、info、warning、error以及critical。通过赋予logger或者handler不同的级别,开发者就可以只输出错误信息到特定的记录文件,或者在调试时只记录调试信息。

 

logging.basicConfig函数各参数:
filename:指定日志文件名;
filemode:和file函数意义相同,指定日志文件的打开模式,‘w‘或者‘a‘;
format:指定输出的格式和内容,format可以输出很多有用的信息,
参数:作用

%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息
datefmt:指定时间格式,同time.strftime();
level:设置日志级别,默认为logging.WARNNING;
stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略;

 

2.2 将日志写入到文件

2.2.1 将日志写入到文件

设置logging,创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中

 

 1 import logging
 2 logger = logging.getLogger(__name__)
 3 logger.setLevel(level = logging.INFO)
 4 handler = logging.FileHandler("log.txt")
 5 handler.setLevel(logging.INFO)
 6 formatter = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s)
 7 handler.setFormatter(formatter)
 8 logger.addHandler(handler)
 9 
10 logger.info("Start print log")
11 logger.debug("Do something")
12 logger.warning("Something maybe fail.")
13 logger.info("Finish")

 

下面是封装的一个 日志打印助手:

 1 import logging.handlers
 2 
 3 """
 4  %(levelno)s: 打印日志级别的数值
 5  %(levelname)s: 打印日志级别名称
 6  %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 7  %(filename)s: 打印当前执行程序名
 8  %(funcName)s: 打印日志的当前函数
 9  %(lineno)d: 打印日志的当前行号
10  %(asctime)s: 打印日志的时间
11  %(thread)d: 打印线程ID
12  %(threadName)s: 打印线程名称
13  %(process)d: 打印进程ID
14  %(message)s: 打印日志信息
15 """
16 
17 class LogAssistant:
18     logger = None
19     # 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,
20 
21     levels = {"d": logging.DEBUG,
22               "i": logging.INFO,
23               "w": logging.WARNING,
24               "e": logging.ERROR,
25               "c": logging.CRITICAL}
26 
27     log_level = "d"
28     log_file = "log.txt"
29     log_max_byte = 10 * 1024 * 1024;
30     log_backup_count = 5
31 
32     @staticmethod
33     def getLogger():
34         if LogAssistant.logger is not None:
35             return LogAssistant.logger
36 
37         LogAssistant.logger = logging.Logger("LogAssistant")
38         log_handler = logging.handlers.RotatingFileHandler(filename=LogAssistant.log_file, 39                                                            maxBytes=LogAssistant.log_max_byte, 40                                                            backupCount=LogAssistant.log_backup_count)
41         log_fmt = logging.Formatter("[%(asctime)s][%(levelname)s][func:%(funcName)s][thread:%(thread)d]: %(message)s")
42         log_handler.setFormatter(log_fmt)
43         LogAssistant.logger.addHandler(log_handler)
44         LogAssistant.logger.setLevel(LogAssistant.levels.get(LogAssistant.log_level))
45         return LogAssistant.logger
46 
47 def output_test():
48     logger = LogAssistant.getLogger()
49     logger.debug("this is a debug msg!")
50 
51 if __name__ == "__main__":
52     output_test()

 


















以上是关于Python 日志打印模块的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Python 日志打印模块

python中记录打印的log模块logging的用法实例

python中使用logging模块在控制台打印日志的同时也打印log文件,但发现控制台的信息会出现重复打印

Python日志模块之你还在用PRINT打印日志吗

Python日志模块之你还在用PRINT打印日志吗