参考:
http://python.jobbole.com/81666/
https://www.cnblogs.com/rollenholt/p/5392338.html
NOSET 0
DEBUG 10
INFO 20
WARNING 30
ERROR 40
CRITICAL 50
DEBUG 诊断问题时使用,在生产环境默认是关闭的。为了方便我们开发和调试,记录流程的关键路径。
INFO 需要开发者确认的信息,关键系统参数的回显、后台服务的初始化状态。
WARNING 出现了异常情况,但是又在合理范围之类的时候
ERROR 系统出现了异常情况,需要修改代码处理。
CRITICAL 说实话我没有用过,我都用ERROR代替了。
自定义日志
# 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 用字典保存输出格式 format_dict = { 1: logging.Formatter('%(asctime)s - %(name)s - %(filename)s - PID%(process)d - %(levelname)s - %(message)s'), 2: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 3: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 4: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'), 5: logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') } class Logger(): def __init__(self, logfile, logname, logformat): ''' 指定保存日志的文件路径,日志级别,以及调用文件 将日志存入到指定的文件中 ''' # 创建一个logger self.logger = logging.getLogger(logname) self.logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(logfile) fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # 定义handler的输出格式 # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') formatter = format_dict[int(logformat)] fh.setFormatter(formatter) ch.setFormatter(formatter) # 给logger添加handler self.logger.addHandler(fh) self.logger.addHandler(ch) def getlog(self): return self.logger if __name__ == '__main__': logger1 = Logger(logfile='log1.txt', logname="fox1", logformat=1).getlog() logger1.debug('i am debug') logger1.info('i am info') logger1.warning('i am warning') logger2 = Logger(logfile='log2.txt', logname="fox2", logformat=2).getlog() logger2.debug('i am debug2') logger2.info('i am info2') logger2.warning('i am warning2')
控制台输出:
2018-01-29 15:51:05,565 - fox1 - mytest4.py - DEBUG - i am debug
2018-01-29 15:51:05,565 - fox1 - mytest4.py - INFO - i am info
2018-01-29 15:51:05,565 - fox1 - mytest4.py - WARNING - i am warning
2018-01-29 15:51:05,565 - fox2 - DEBUG - i am debug2
2018-01-29 15:51:05,565 - fox2 - INFO - i am info2
2018-01-29 15:51:05,565 - fox2 - WARNING - i am warning2
文件中写入
log1.txt
2018-01-29 15:53:28,861 - fox1 - mytest4.py - DEBUG - i am debug
2018-01-29 15:53:28,861 - fox1 - mytest4.py - INFO - i am info
2018-01-29 15:53:28,861 - fox1 - mytest4.py - WARNING - i am warning
log2.txt
2018-01-29 15:53:28,862 - fox2 - DEBUG - i am debug2
2018-01-29 15:53:28,862 - fox2 - INFO - i am info2
2018-01-29 15:53:28,862 - fox2 - WARNING - i am warning2
日志片段:
import logging import time import os import sys # 日志文件配置 LOG_DIR_NAME = 'log' # 日志统一存放文件夹 LOG_DIR_PATH = os.path.join(os.getcwd(), LOG_DIR_NAME) # 日志统一存放完整路径 if not os.path.exists(LOG_DIR_PATH): # 日志统一存放路径不存在,则创建该路径 os.makedirs(LOG_DIR_PATH) # print(LOG_DIR_PATH) # sys.exit() # 写入日志文件的配置 logging.basicConfig(level=logging.DEBUG, # 设置写入级别。日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET # 设置写入样式。'2018-01-12 13:09:02|mytest.py|<module>|line:9|INFO|start runing' format='%(asctime)s|%(filename)s|%(funcName)s|line:%(lineno)d|%(levelname)s|%(message)s', datefmt='%Y-%m-%d %X', filename=LOG_DIR_PATH + os.sep + time.strftime("%Y%m%d") + '.log' # 写入文件位置和文件名 ) # 控制台打印输出日志 console = logging.StreamHandler() # 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象 console.setLevel(logging.INFO) # 设置要打印日志的等级,低于这一等级,不会打印 formatter = logging.Formatter('%(asctime)s|%(name)-8s: %(levelname)-8s| %(message)s') # 控制台输出样式 console.setFormatter(formatter) logging.getLogger('').addHandler(console) # 定义日志内容(用于写入日志文件和控制台的打印) logging.critical('CRITICAL le') # 定义严重日志内容 logging.error('error le') # 定义错误日志内容 try: 1 / 0 except Exception as e: logging.warning('exception: %s', e) # 定义警告日志内容 logging.info('start runing') # 定义消息日志内容 logging.info('login done') str1 = 'lalala' logging.debug(" %s ", str1) # 定义调试日志内容