#!/bin/env python # -*- coding: utf-8 -*- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """ log模块,palo测试所有日志通过该模块打印 Date: 2014/11/24 17:19:26 """ import logging import os import json import pprint class Logger(object): """ 定义了一个log,包含了所有需要的log输出方式 """ logger = None title_format = "[%(levelname)s][%(asctime)s][%(thread)d]" body_format = "[%(filename)s:%(lineno)s][%(funcName)s] %(message)s" format = "%s%s" % (title_format, body_format) pathList = ['./log/palo_test.log'] logLevel = logging.INFO stdLogLevel = logging.ERROR @classmethod def ensureDir(cls, dirName): """ 确定输入目录存在,如果没有就创建 Attributes: dirName: 日志输入位置 """ ret = 0 if not dirName.strip(): ret = 0 elif not os.path.exists(dirName): ret = cls.ensureDir(os.path.dirname(dirName)) if 0 == ret: try: os.mkdir(dirName) except Exception as error: ret = -1 print("mkdir %s fail, Exception : %s" % (dirName, str(error))) elif not os.path.isdir(dirName): ret = -1 print("%s exists, but not dir" % dirName) return ret @classmethod def initLogger(cls): """ 初始化日志模块 """ if Logger.logger is None: Logger.logger = logging.getLogger("GTTS") Logger.logger.setLevel(Logger.logLevel) logFormat = logging.Formatter(Logger.format) for filePath in Logger.pathList: if "std" != filePath: ret = cls.ensureDir(os.path.dirname(filePath)) if 0 != ret: continue if not Logger.logger.handlers: handler = logging.FileHandler(filePath, encoding='utf-8') handler.setFormatter(logFormat) Logger.logger.addHandler(handler) else: handler = logging.StreamHandler() handler.setFormatter(logFormat) handler.setLevel(Logger.stdLogLevel) Logger.logger.addHandler(handler) @classmethod def getLogger(cls): """ 获得一个log模块 """ if Logger.logger is None: cls.initLogger() return Logger.logger @classmethod def setLogFormat(cls, format): """ 设置log的输出格式 Attributes: format: log输出格式 """ Logger.format = format @classmethod def addLogPath(cls, path): """ 添加日志输出位置 """ Logger.pathList.append(path) @classmethod def setLogPath(cls, path): """ 设置日志输出位置 """ Logger.pathList = [path] class StructedLogMessage(object): """ 定义一种日志消息 可以支持格式化打印日志 """ def __init__(self, message, **kwargs): self.message = message self.kwargs = kwargs def _pretty(self, data, indent=0): """ 支持格式化打印日志 """ result = "" TAB = " " if isinstance(data, dict): result += '{\n' for key, value in data.iteritems(): result += TAB * indent result += '%s: ' % str(key) + self._pretty(value, indent + 1) result += '\n' result += TAB * (indent - 1) + '}' elif isinstance(data, list): for val in data: result += '[\n' result += TAB * indent + self._pretty(val, indent + 1) + '\n' result += TAB * (indent - 1) + ']\n' else: result += str(data) return result def __str__(self): """ 支持普通的字符串形式 """ return "[%s][%s]" % (self.message, str(self.kwargs))