160 lines
4.8 KiB
Python
160 lines
4.8 KiB
Python
#!/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))
|
|
|