赞
踩
目录
如何使用python自带的 logging 模块实现日志功能
- import os
- import logging
- import sys
- LOG_PATH = 'logs' #设置log路径
- LOG_FILE = 'text.txt' #设置log文件名
-
- #设置根路径为起始位置
- logger = logging.getLogger(__name__)
- #生成log指定路径
-
- if os.path.exists(LOG_PATH):
- pass
- else:
- os.mkdir(LOG_PATH)
- formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
-
- file_handler = logging.FileHandler("%s/%s" % (LOG_PATH, LOG_FILE))
-
- # 可以通过setFormatter指定输出格式
- file_handler.setFormatter(formatter)
-
- logger.addHandler(file_handler)
分为如下几个级别:
- _nameToLevel = {
- 'CRITICAL': CRITICAL,
- 'FATAL': FATAL,
- 'ERROR': ERROR,
- 'WARN': WARNING,
- 'WARNING': WARNING,
- 'INFO': INFO,
- 'DEBUG': DEBUG,
- 'NOTSET': NOTSET,
- }
使用setLevel函数指定输出级别 指定之后将只显示级别以上的日志类型
logger.setLevel(logging.DEBUG)
python 提供了两个处理器,方便我们分割文件:
logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件
- TimedRotatingFileHandler(filename='logs/info/' +
- info_file_name,
- when='MIDNIGHT',
- interval=1,
- backupCount=7,
- encoding='utf-8')
- # filename:日志文件名
- # when:日志文件按什么维度切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周
- # 这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',而是从你
- # 项目启动开始,过了24小时,才会从新创建一个新的日志文件,
- # 如果项目重启,这个时间就会重置。所以这里选择'MIDNIGHT'-是指过了午夜
- # 12点,就会创建新的日志。
- # interval:是指等待多少个单位 when 的时间后,Logger会自动重建文件。
- # 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: 表示日志文件的保留个数
- #输出debug类型日志
- logger.debug("debug")
-
- #多参数传递 输入info类型日志
- pam= "dshck"
- pam2="cxjkdhc"
- logger.info("%s%s"%(pam,pam2))
log.py 代码如下
- import os
- import logging
- from logging.handlers import TimedRotatingFileHandler
- import datetime
- import json
-
- LOG_PATH = "log"
- LOG_INFO = '_info.log'
- LOG_ERROR = '_error.log'
-
-
- class logger:
- def __init__(self,prefix_name = "flask"):
- if os.path.exists(LOG_PATH):
- pass
- else:
- os.mkdir(LOG_PATH)
- self.prefix = prefix_name
- self.info_logger = logging.getLogger("info")
- self.error_logger = logging.getLogger("error")
- self.format = logging.Formatter('[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s]\
- [%(filename)s:%(lineno)d]' '[%(levelname)s] : %(message)s')
- #指定文件位置文件名以及输出格式
- info_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_INFO))
- info_file_handler.setFormatter(self.format)
- error_file_handler = logging.FileHandler("%s/%s%s" % (LOG_PATH, prefix_name,LOG_ERROR))
- error_file_handler.setFormatter(self.format)
- self.info_logger.addHandler(info_file_handler)
- self.error_logger.addHandler(error_file_handler)
- # 指定日志的最低输出级别
- self.info_logger.setLevel(logging.NOTSET)
- self.error_logger.setLevel(logging.ERROR)
-
- def debug(self, msg, *args, **kwargs):
- self.info_logger.debug(msg, *args, **kwargs)
-
- def info(self, msg, *args, **kwargs):
- self.info_logger.info(msg, *args, **kwargs)
-
- def warn(self, msg, *args, **kwargs):
- self.info_logger.warning(msg, *args, **kwargs)
-
- def warning(self, msg, *args, **kwargs):
- self.info_logger.warning(msg, *args, **kwargs)
-
- def error(self, msg, *args, **kwargs):
- self.error_logger.error(msg, *args, **kwargs)
-
- def fatal(self, msg, *args, **kwargs):
- self.error_logger.fatal(msg, *args, **kwargs)
-
- def critical(self, msg, *args, **kwargs):
- self.error_logger.critical(msg, *args, **kwargs)
-
-
- # log =logger()
- # log.info("jdshskh")
- # log.error("hdskck")
- # log.debug("1122debug")
- # log.warn("warn")
- # log.warning("warning")
- # log.critical("critical")
- # log.fatal("fatal")
-
- log =logger("celery")
- log.info("jdshskh")
- log.error("hdskck")
- log.debug("1122debug")
- log.warn("warn")
- log.warning("warning")
- log.critical("critical")
- log.fatal("fatal")
- import logging
-
-
- logger = logging.getLogger()
-
-
- def setup_logging(logfile, verbose):
- """
- 设置日志记录到日志文件/控制台。
- :param logfile:要写入日志的文件的路径。
- :param verbose:如果为true,则启用详细日志记录。
- """
- root_logger = logging.getLogger()
-
- default_formatter = logging.Formatter('%(asctime)-15s (%(name)s) %(filename)s[line:%(lineno)d] : %(message)s')
-
- if verbose:
- loglevel = logging.DEBUG
- else:
- loglevel = logging.INFO
- root_logger.setLevel(loglevel)
-
- console_log = logging.StreamHandler()
- console_log.setLevel(loglevel)
- console_log.setFormatter(default_formatter)
- root_logger.addHandler(console_log)
-
- if logfile in ('/dev/log', '/dev/syslog', '/var/run/syslog', '/var/run/log'):
- file_log = logging.handlers.SysLogHandler(address=logfile, facility='local1')
- syslog_formatter = logging.Formatter('beeswarm[%(process)d]: %(message)s')
- file_log.setFormatter(syslog_formatter)
- else:
- file_log = logging.FileHandler(logfile)
- file_log.setFormatter(default_formatter)
- file_log.setLevel(loglevel)
- root_logger.addHandler(file_log)
-
- # 日志按天自动创建
- """
- time_rotating_file_handler = handlers.TimedRotatingFileHandler(filename=logfile, when='S')
- #time_rotating_file_handler.setLevel(logging.ERROR)
- time_rotating_file_handler.setLevel(logging.INFO)
- time_rotating_file_handler.setFormatter(default_formatter)
- root_logger.addHandler(time_rotating_file_handler)
- """
-
-
- if __name__ == '__main__':
- setup_logging(args.logfile, args.verbose)
-
- logger.info('Initializing BeeSwarm version {0}'.format(beeswarm.version))
- logger.debug('workdir = {0}, config = {1}, customize = {2}, clear_db = {3}, reset_password = {4}, max_sessions = {5}, start_webui = {6}.'.format(args.workdir,
- config, args.customize, args.clearsessions, args.resetpw, args.max_sessions, not args.no_webui))
- logger.debug('workdir = {0}'.format())
- logger.error(...)
- logger.warning(...)
配置文件log_config.py
- # -*- coding: utf-8 -*-
- import os
- import time
- import logging.config
-
- cur_path = os.path.dirname(os.path.realpath(__file__)) # log_path是存放日志的路径
- log_path = os.path.join(os.path.dirname(cur_path), 'logs')
- if not os.path.exists(log_path):
- os.mkdir(log_path) # 如果不存在这个logs文件夹,就自动创建一个
-
-
- def setp_log():
- LOGGING_CONFIG = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'formatters': {
- # 日志格式
- 'simple': {
- 'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'},
- # 简单格式
- 'standard': {
- #'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s -- %(funcName)s:%(lineno)s] [%(message)s]'
- 'format': '[%(asctime)s] [%(filename)s:%(lineno)s] [%(message)s]'
- },
- },
- # 定义具体处理日志的方式
- 'handlers': {
- # 控制台输出
- 'console_handler': {
- 'level': 'DEBUG',
- 'class': 'logging.StreamHandler',
- 'formatter': 'simple'
- },
- # 默认记录所有日志,按日期滚动输出到文件
- 'info_handler': {
- 'level': 'INFO',
- 'class': 'logging.handlers.RotatingFileHandler',
- 'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))), # 按日分类
- 'maxBytes': 1024 * 1024 * 5, # 文件大小
- 'backupCount': 5, # 备份数
- 'formatter': 'standard', # 输出格式
- 'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码
- },
- # 输出错误日志
- #'error_handler': {
- 'success_handler': {
- 'level': 'CRITICAL',
- #'level': 'ERROR',
- 'class': 'logging.handlers.RotatingFileHandler',
- 'filename': os.path.join(log_path, 'success-{}.log'.format(time.strftime('%Y-%m'))), # 按月分类
- 'maxBytes': 1024 * 1024 * 5, # 文件大小
- 'backupCount': 5, # 备份数
- 'formatter': 'standard', # 输出格式
- 'encoding': 'utf-8', # 设置默认编码
- },
-
- },
- 'loggers': {
- 'log': {
- 'handlers': ['console_handler', 'info_handler', 'success_handler'],
- 'level': 'INFO',
- 'propagate': True
- },
- }
- }
- logging.config.dictConfig(LOGGING_CONFIG)
测试代码aaa.py
- # -*- coding: utf-8 -*-
- import logging
- from log_config import setp_log
- setp_log()
- logger = logging.getLogger('log')
-
- logger.info("asdasd")
- logger.critical("asd123")
- logger.error("asd")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。