当前位置:   article > 正文

python import logging日志(日志封装)

import logging

目录

创建日志类并使用

1.初始化一个logger对象

1)引入模块

2)初始化变量,声明logger对象

3) 生成路径

4)指定logger输出格式

5)指定日志文件的输出级别

6) 自动分割日志文件

2.输入日志内容

开源日志实例

多日志输出实例


创建日志类并使用

如何使用python自带的 logging 模块实现日志功能

1.初始化一个logger对象

1)引入模块

  1. import os
  2. import logging
  3. import sys

2)初始化变量,声明logger对象

  1. LOG_PATH = 'logs' #设置log路径
  2. LOG_FILE = 'text.txt' #设置log文件名
  3. #设置根路径为起始位置
  4. logger = logging.getLogger(__name__)

3) 生成路径

  1. #生成log指定路径
  2. if os.path.exists(LOG_PATH):
  3. pass
  4. else:
  5. os.mkdir(LOG_PATH)

4)指定logger输出格式

  1. formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  2. file_handler = logging.FileHandler("%s/%s" % (LOG_PATH, LOG_FILE))
  3. # 可以通过setFormatter指定输出格式
  4. file_handler.setFormatter(formatter)
  5. logger.addHandler(file_handler)

5)指定日志文件的输出级别

分为如下几个级别:

  1. _nameToLevel = {
  2. 'CRITICAL': CRITICAL,
  3. 'FATAL': FATAL,
  4. 'ERROR': ERROR,
  5. 'WARN': WARNING,
  6. 'WARNING': WARNING,
  7. 'INFO': INFO,
  8. 'DEBUG': DEBUG,
  9. 'NOTSET': NOTSET,
  10. }

使用setLevel函数指定输出级别 指定之后将只显示级别以上的日志类型

logger.setLevel(logging.DEBUG)

6) 自动分割日志文件

python 提供了两个处理器,方便我们分割文件:

logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件

logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件

  1. TimedRotatingFileHandler(filename='logs/info/' +
  2. info_file_name,
  3. when='MIDNIGHT',
  4. interval=1,
  5. backupCount=7,
  6. encoding='utf-8')
  1. # filename:日志文件名
  2. # when:日志文件按什么维度切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
  3. # 这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',而是从你
  4. # 项目启动开始,过了24小时,才会从新创建一个新的日志文件,
  5. # 如果项目重启,这个时间就会重置。所以这里选择'MIDNIGHT'-是指过了午夜
  6. # 12点,就会创建新的日志。
  7. # interval:是指等待多少个单位 when 的时间后,Logger会自动重建文件。
  8. # backupCount:是保留日志个数。默认的0是不会自动删除掉日志。

when是一个字符串用于描述滚动周期的基本单位,字符串的值及意义如下:

'S': Seconds

'M': Minutes

'H': Hours

'D': Days

'W': Week day (0=Monday)

'midnight': Roll over at midnight

interval: 滚动周期,单位有when指定,比如:when='D',interval=1,表示每天产生一个日志文件;

backupCount: 表示日志文件的保留个数

2.输入日志内容

  1. #输出debug类型日志
  2. logger.debug("debug")
  3. #多参数传递 输入info类型日志
  4. pam= "dshck"
  5. pam2="cxjkdhc"
  6. logger.info("%s%s"%(pam,pam2))

log.py 代码如下

  1. import os
  2. import logging
  3. from logging.handlers import TimedRotatingFileHandler
  4. import datetime
  5. import json
  6. LOG_PATH = "log"
  7. LOG_INFO = '_info.log'
  8. LOG_ERROR = '_error.log'
  9. class logger:
  10. def __init__(self,prefix_name = "flask"):
  11. if os.path.exists(LOG_PATH):
  12. pass
  13. else:
  14. os.mkdir(LOG_PATH)
  15. self.prefix = prefix_name
  16. self.info_logger = logging.getLogger("info")
  17. self.error_logger = logging.getLogger("error")
  18. self.format = logging.Formatter('[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s]\
  19. [%(filename)s:%(lineno)d]' '[%(levelname)s] : %(message)s')
  20. #指定文件位置文件名以及输出格式
  21. info_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_INFO))
  22. info_file_handler.setFormatter(self.format)
  23. error_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_ERROR))
  24. error_file_handler.setFormatter(self.format)
  25. self.info_logger.addHandler(info_file_handler)
  26. self.error_logger.addHandler(error_file_handler)
  27. # 指定日志的最低输出级别
  28. self.info_logger.setLevel(logging.NOTSET)
  29. self.error_logger.setLevel(logging.ERROR)
  30. def debug(self, msg, *args, **kwargs):
  31. self.info_logger.debug(msg, *args, **kwargs)
  32. def info(self, msg, *args, **kwargs):
  33. self.info_logger.info(msg, *args, **kwargs)
  34. def warn(self, msg, *args, **kwargs):
  35. self.info_logger.warning(msg, *args, **kwargs)
  36. def warning(self, msg, *args, **kwargs):
  37. self.info_logger.warning(msg, *args, **kwargs)
  38. def error(self, msg, *args, **kwargs):
  39. self.error_logger.error(msg, *args, **kwargs)
  40. def fatal(self, msg, *args, **kwargs):
  41. self.error_logger.fatal(msg, *args, **kwargs)
  42. def critical(self, msg, *args, **kwargs):
  43. self.error_logger.critical(msg, *args, **kwargs)
  44. # log =logger()
  45. # log.info("jdshskh")
  46. # log.error("hdskck")
  47. # log.debug("1122debug")
  48. # log.warn("warn")
  49. # log.warning("warning")
  50. # log.critical("critical")
  51. # log.fatal("fatal")
  52. log =logger("celery")
  53. log.info("jdshskh")
  54. log.error("hdskck")
  55. log.debug("1122debug")
  56. log.warn("warn")
  57. log.warning("warning")
  58. log.critical("critical")
  59. log.fatal("fatal")

开源日志实例

  1. import logging
  2. logger = logging.getLogger()
  3. def setup_logging(logfile, verbose):
  4. """
  5. 设置日志记录到日志文件/控制台。
  6. :param logfile:要写入日志的文件的路径。
  7. :param verbose:如果为true,则启用详细日志记录。
  8. """
  9. root_logger = logging.getLogger()
  10. default_formatter = logging.Formatter('%(asctime)-15s (%(name)s) %(filename)s[line:%(lineno)d] : %(message)s')
  11. if verbose:
  12. loglevel = logging.DEBUG
  13. else:
  14. loglevel = logging.INFO
  15. root_logger.setLevel(loglevel)
  16. console_log = logging.StreamHandler()
  17. console_log.setLevel(loglevel)
  18. console_log.setFormatter(default_formatter)
  19. root_logger.addHandler(console_log)
  20. if logfile in ('/dev/log', '/dev/syslog', '/var/run/syslog', '/var/run/log'):
  21. file_log = logging.handlers.SysLogHandler(address=logfile, facility='local1')
  22. syslog_formatter = logging.Formatter('beeswarm[%(process)d]: %(message)s')
  23. file_log.setFormatter(syslog_formatter)
  24. else:
  25. file_log = logging.FileHandler(logfile)
  26. file_log.setFormatter(default_formatter)
  27. file_log.setLevel(loglevel)
  28. root_logger.addHandler(file_log)
  29. # 日志按天自动创建
  30. """
  31. time_rotating_file_handler = handlers.TimedRotatingFileHandler(filename=logfile, when='S')
  32. #time_rotating_file_handler.setLevel(logging.ERROR)
  33. time_rotating_file_handler.setLevel(logging.INFO)
  34. time_rotating_file_handler.setFormatter(default_formatter)
  35. root_logger.addHandler(time_rotating_file_handler)
  36. """
  37. if __name__ == '__main__':
  38. setup_logging(args.logfile, args.verbose)
  39. logger.info('Initializing BeeSwarm version {0}'.format(beeswarm.version))
  40. logger.debug('workdir = {0}, config = {1}, customize = {2}, clear_db = {3}, reset_password = {4}, max_sessions = {5}, start_webui = {6}.'.format(args.workdir,
  41. config, args.customize, args.clearsessions, args.resetpw, args.max_sessions, not args.no_webui))
  42. logger.debug('workdir = {0}'.format())
  43. logger.error(...)
  44. logger.warning(...)

多日志输出实例

配置文件log_config.py

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import time
  4. import logging.config
  5. cur_path = os.path.dirname(os.path.realpath(__file__)) # log_path是存放日志的路径
  6. log_path = os.path.join(os.path.dirname(cur_path), 'logs')
  7. if not os.path.exists(log_path):
  8. os.mkdir(log_path) # 如果不存在这个logs文件夹,就自动创建一个
  9. def setp_log():
  10. LOGGING_CONFIG = {
  11. 'version': 1,
  12. 'disable_existing_loggers': False,
  13. 'formatters': {
  14. # 日志格式
  15. 'simple': {
  16. 'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'},
  17. # 简单格式
  18. 'standard': {
  19. #'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'
  20. 'format': '[%(asctime)s] [%(filename)s:%(lineno)s] [%(message)s]'
  21. },
  22. },
  23. # 定义具体处理日志的方式
  24. 'handlers': {
  25. # 控制台输出
  26. 'console_handler': {
  27. 'level': 'DEBUG',
  28. 'class': 'logging.StreamHandler',
  29. 'formatter': 'simple'
  30. },
  31. # 默认记录所有日志,按日期滚动输出到文件
  32. 'info_handler': {
  33. 'level': 'INFO',
  34. 'class': 'logging.handlers.RotatingFileHandler',
  35. 'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))), # 按日分类
  36. 'maxBytes': 1024 * 1024 * 5, # 文件大小
  37. 'backupCount': 5, # 备份数
  38. 'formatter': 'standard', # 输出格式
  39. 'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码
  40. },
  41. # 输出错误日志
  42. #'error_handler': {
  43. 'success_handler': {
  44. 'level': 'CRITICAL',
  45. #'level': 'ERROR',
  46. 'class': 'logging.handlers.RotatingFileHandler',
  47. 'filename': os.path.join(log_path, 'success-{}.log'.format(time.strftime('%Y-%m'))), # 按月分类
  48. 'maxBytes': 1024 * 1024 * 5, # 文件大小
  49. 'backupCount': 5, # 备份数
  50. 'formatter': 'standard', # 输出格式
  51. 'encoding': 'utf-8', # 设置默认编码
  52. },
  53. },
  54. 'loggers': {
  55. 'log': {
  56. 'handlers': ['console_handler', 'info_handler', 'success_handler'],
  57. 'level': 'INFO',
  58. 'propagate': True
  59. },
  60. }
  61. }
  62. logging.config.dictConfig(LOGGING_CONFIG)

测试代码aaa.py

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. from log_config import setp_log
  4. setp_log()
  5. logger = logging.getLogger('log')
  6. logger.info("asdasd")
  7. logger.critical("asd123")
  8. logger.error("asd")
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/590586
推荐阅读
相关标签
  

闽ICP备14008679号