Python打印日志到文件的详细案例---python-logger的使用方法
1.案例要求:
要求如下:
1.日志文件名称audio_当前进程pid_当前时间.log,大小为5M。
2.日志文件输出目录为/xxx/xxx/xxx.
3.程序开始时输出串口是否打开成功。
4.循环输出某个方法的执行情况。
5.当日志满5M时,从头开始覆盖写入,并做标记哪个部分是最新生成的(可以在每次日志的前面打印时间戳)
6.日志内容分为等级打印
2.python日志输出等级介绍
- logger.debug(msg, *args, **kwargs):记录一条debug级别的消息。此级别通常用于详细的调试信息,这些信息在开发过程中可能有用,但在生产中不是必需的所以最后的交付版本往往不输出此部分内容。
- logger.info(msg, *args, **kwargs):记录一条级别为info的消息。此级别用于提供有关应用程序状态或行为的一般信息便于查看运行过程和运行情况。
- logger.warning(msg, *args, **kwargs): 记录一条级别为warning的消息。此级别用于指示发生了意外或潜在问题(可能会造成未知错误),但应用程序仍能继续运行。
- logger.error(msg, *args, **kwargs): 记录一条级别为error的消息。此级别用于指示发生了阻止应用程序正常运行的错误(此时程序往往已经无法运行)。
- logger.critical(msg, *args, **kwargs): 记录一条级别为critical的消息。此级别用于指示发生了可能导致应用程序崩溃或无法使用的严重错误。
在案例中提供的代码,logger被设置为在DEBUG级别进行日志记录,这意味着所有具有DEBUG或更高级别(INFO、WARNING、ERROR和CRITICAL)的消息都将被记录。这是一个很好的开发选择,但在生产中,应该将logger设置为更高的级别(如INFO或WARNING)可能更合适,以减少日志输出量并提高性能。
3.案例代码:
1 import os 2 import logging 3 import time 4 import serial 5 6 def set_logger(): 7 8 # 设置日志文件的输出目录 9 log_dir = 'D:/my_code/XXX/xxx' 10 # 获取当前进程的pid 11 pid = os.getpid() 12 13 # 设置日志文件的名称 14 log_file_name = f'audio_{pid}_{time.strftime("%Y%m%d%H%M%S", time.localtime())}.log' 15 16 # 设置日志文件的大小为5M 17 log_file_size = 5 * 1024 * 1024 18 19 # 创建日志文件的输出目录 20 if not os.path.exists(log_dir): 21 os.makedirs(log_dir) 22 23 # 设置日志的格式 24 log_format = '%(asctime)s - %(levelname)s - %(message)s' 25 26 global logger 27 # 创建一个logger 28 logger = logging.getLogger(__name__) 29 logger.setLevel(logging.DEBUG) 30 31 # 创建一个handler,用于写入日志文件 32 file_handler = logging.FileHandler(os.path.join(log_dir, log_file_name), mode='w', encoding='utf-8') 33 file_handler.setLevel(logging.DEBUG) 34 35 # 创建一个handler,用于输出到控制台 36 console_handler = logging.StreamHandler() 37 console_handler.setLevel(logging.DEBUG) 38 39 # 定义handler的输出格式 40 formatter = logging.Formatter(log_format) 41 file_handler.setFormatter(formatter) 42 console_handler.setFormatter(formatter) 43 44 # 给logger添加handler 45 logger.addHandler(file_handler) 46 logger.addHandler(console_handler) 47 48 # 打开串口 49 ser = serial.Serial('COM3', 9600) 50 if ser.isOpen(): 51 logger.info('串口打开成功') 52 else: 53 logger.error('串口打开失败') 54 55 # 循环输出某个方法的执行情况 56 while True: 57 try: 58 # 执行某个方法 59 result = some_method() 60 logger.debug(f'执行结果:{result}') 61 except Exception as e: 62 logger.error(f'执行出错:{e}') 63 64 # 判断日志文件是否超过5M 65 if os.path.getsize(os.path.join(log_dir, log_file_name)) > log_file_size: 66 # 从头开始覆盖写入 67 file_handler.mode = 'w' 68 # 在日志文件的前面打印时间戳 69 logger.info(f'{"="*20} 新日志 {"="*20}')
4.关键点介绍
主要的创建过程都在set_logger()函数中,其中包含了设置log的名称,路径、格式、大小以及等级。
此外我们为logger添加了两个Handler,一个使logger内容输出到控制台,一个使logger内容保存到文件,这样的话在开发过程中logger就可以完全代替print函数
# 创建一个handler,用于写入日志文件
32 file_handler = logging.FileHandler(os.path.join(log_dir, log_file_name), mode='w', encoding='utf-8')
33 file_handler.setLevel(logging.DEBUG)
# 创建一个handler,用于输出到控制台 36 console_handler = logging.StreamHandler() 37 console_handler.setLevel(logging.DEBUG)
# 给logger添加handler
45 logger.addHandler(file_handler)
46 logger.addHandler(console_handler)