1.日志级别

级别顺序从高到低
critical>error>warning>info>debug

  • debug: 打印全部的日志,详细的信息,通常只出现在诊断问题上
  • info: 打印info,warning,error,critical级别的日志,确认一切按预期运行
  • warning: 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
  • error: 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
  • critical: 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

日志格式变量:

  • %(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: 打印日志信息
  1. import logging
  2. # logging.basicConfig(level=logging.DEBUG)
  3. logging.debug("i am is debug log")
  4. logging.info("i am is info log")
  5. logging.warning("i am is warning log!!")
  6. logging.error("i am is error log!!!")
  7. logging.critical("i am is critical log!!!!")

image.png
默认日志级别是warning,所以不显示debug跟info级别的日志
如果要显示开启注释,logging.basicConfig(level=logging.DEBUG)

2.日志输出到控制台

  1. import logging
  2. logging.basicConfig(level=logging.DEBUG,
  3. format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
  4. logging.debug("i am is debug log")
  5. logging.info("i am is info log")
  6. logging.warning("i am is warning log!!")
  7. logging.error("i am is error log!!!")
  8. logging.critical("i am is critical log!!!!")

image.png

3.将日志写入文件

  1. import logging
  2. import os.path
  3. import time
  4. # 第一步,创建一个logger
  5. logger = logging.getLogger()
  6. logger.setLevel(logging.INFO) # Log等级总开关
  7. # 第二步,创建一个handler,用于写入日志文件
  8. rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
  9. log_path = os.path.dirname(os.getcwd()) + '/Logs/'
  10. if not os.path.exists(log_path):
  11. os.mkdir(log_path)
  12. log_name = log_path + rq + '.log'
  13. logfile = log_name
  14. fh = logging.FileHandler(logfile, mode='w')
  15. fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
  16. # 第三步,定义handler的输出格式
  17. formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
  18. fh.setFormatter(formatter)
  19. # 第四步,将logger添加到handler里面
  20. logger.addHandler(fh)
  21. # 日志
  22. logging.debug("i am is debug log")
  23. logging.info("i am is info log")
  24. logging.warning("i am is warning log!!")
  25. logging.error("i am is error log!!!")
  26. logging.critical("i am is critical log!!!!")

image.png

4.同时将日志输出到控制台及写入文件

  1. import logging
  2. import os
  3. import time
  4. # 第一步,创建一个logger
  5. logger = logging.getLogger()
  6. logger.setLevel(logging.INFO) # Log等级总开关
  7. # 第二步,创建一个handler,用于写入日志文件
  8. rq = "app"
  9. log_path = os.path.dirname(os.getcwd()) + '/Logs/'
  10. if not os.path.exists(log_path):
  11. os.mkdir(log_path)
  12. log_name = log_path + rq + '.log'
  13. logfile = log_name
  14. fh = logging.FileHandler(logfile, mode='w')
  15. fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
  16. #控制台的handler
  17. ch = logging.StreamHandler()
  18. #设置控制台输入的日志为warning级别以上的
  19. ch.setLevel(logging.WARNING)
  20. # 第三步,定义handler的输出格式
  21. formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
  22. fh.setFormatter(formatter)
  23. ch.setFormatter(formatter)
  24. # 第四步,将logger添加到handler里面
  25. logger.addHandler(fh)
  26. logger.addHandler(ch)
  27. # 日志
  28. logging.debug("i am is debug log")
  29. logging.info("i am is info log")
  30. logging.warning("i am is warning log!!")
  31. logging.error("i am is error log!!!")
  32. logging.critical("i am is critical log!!!!")

控制台日志
image.png
文件日志
image.png

5.日志按天切割

  1. import os
  2. import logging
  3. import re
  4. from logging.handlers import TimedRotatingFileHandler
  5. def setup_log(log_name):
  6. # 创建logger对象。传入logger名字
  7. logger = logging.getLogger(log_name)
  8. log_path = os.path.dirname(os.getcwd()) + '/Logs/'
  9. if not os.path.exists(log_path):
  10. os.mkdir(log_path)
  11. log_path = os.path.join(log_path,log_name)
  12. # 设置日志记录等级
  13. logger.setLevel(logging.DEBUG)
  14. # interval 滚动周期,
  15. # when="MIDNIGHT", interval=1 表示每天0点为更新点,每天生成一个文件
  16. # backupCount 表示日志保存个数
  17. file_handler = TimedRotatingFileHandler(
  18. filename=log_path, when="MIDNIGHT", interval=1, backupCount=30,encoding="utf-8"
  19. )
  20. # filename="app" suffix设置,会生成文件名为mylog.2020-02-25.log
  21. file_handler.suffix = "%Y-%m-%d.log"
  22. # extMatch是编译好正则表达式,用于匹配日志文件名后缀
  23. # 需要注意的是suffix和extMatch一定要匹配的上,如果不匹配,过期日志不会被删除。
  24. file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
  25. # 定义日志输出格式
  26. file_handler.setFormatter(
  27. logging.Formatter(
  28. "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
  29. )
  30. )
  31. logger.addHandler(file_handler)
  32. return logger
  33. if __name__ == "__main__":
  34. logger = setup_log("app")
  35. logger.info("this is info message")
  36. logger.warning("this is a warning message")
  37. try:
  38. int("aaaaa")
  39. except Exception as e:
  40. logger.error("强行转int失败",exc_info=e)