profHelper のソースコード

#!
# coding: utf-8
# Copyright (C) 2017 TOPS SYSTEMS
### @file  profHelper.py
### @brief profiling log helper
###
### VPPL -i によるログ内に出力されるプロファイリングポイントを集計する
### UNIT@CONTER値
###
### Contact: izumida@topscom.co.jp
###
### @author: M.Izumida
### @date: March 31, 2017
###
## v01r01 Newly created
##
# Written for Python 2.7 (NOT FOR 3.x)
#=======================================================================
# インポート宣言
from __future__ import division
import sys
import re
import argparse
import os
import csv
from datetime import datetime
#=======================================================================
# バージョン文字列
versionSTR = "profHelper.py v01r01 Tops Systems (pgm by mpi)"
#=======================================================================
# 共通サブルーチン
#-------------------------------------------------------------------
def errPrint(mes):
    """errPrint.

    エラー出力へのメッセージ表示
    後の始末はその後で別に書くこと
    """
    sys.stderr.write(mes)
    sys.stderr.write('\n')

#-------------------------------------------------------------------
def stdExceptionHandler(mes):
    """standard Exception Handler.

    エラーメッセージを送出し、デバッグのための情報を出力する
    """
    errPrint("Exception Captured: " + str(mes))
    errPrint("0:" + str(sys.exc_info()[0]))
    errPrint("1:" + str(sys.exc_info()[1]))
    errPrint("2:" + str(sys.exc_info()[2]))
#-------------------------------------------------------------------
def tryIntParse(st, dval, radix=10):
    """try Parse string to Integer

    文字列stをパースして整数化できれば値を返す、できなければデフォルト値dvalを返す
    """
    try:
        work = int(st, radix)
    except:
        return dval
    return work

#-------------------------------------------------------------------
def repExt(fname, newext):
    """Relpace Extension

    fnameの拡張子部分をnewextでリプレースした文字列を返す
    """
    tempName, ext = os.path.splitext(os.path.basename(fname))
    return tempName + newext

#=======================================================================
# log ファイルリーダクラス
[ドキュメント]class logReader: """VPPL -i log Reader Class. VPPL -i 形式のLOGを読み取って集計するクラス """ #-------------------------------------------------------------------- def __init__(self, ifnam, ofnam): """log Reader Constructor コンストラクタ """ self.iFname = ifnam #<<! 読み込むLOGファイル名 self.oFname = ofnam #<<! 書き出すLOGファイル名 self.sumDic = dict() #<<! UNIT名->積算値の連想配列 self.foundCount = 0 #<<! prof pointの発見数 self.unitCount = 0 #<<! unit名の個数 self.errCount = 0 #<<! error個数 self.oldCount = 0 #<<! 1つ前のカウント値 # self.p0 = re.compile('([0-9a-zA-Z]+)> ([0-9a-zA-Z]+)@([0-9]+)') #デバッグ self.debug = False #<<! デバッグモードフラグ self.verbose = False #<<! バーボスモードフラグ #--------------------------------------------------------------------
[ドキュメント] def read(self): """read log ファイルからレコードをリードして処理するメソッド 読み取り成功すれば真 """ nLine = 1 try: with open(self.iFname, 'r') as f: for line in f: if self.rLine(line): break nLine += 1 except: stdExceptionHandler("ERROR: in file reading = " + self.iFname + " line#=" + str(nLine)) return False return True
#--------------------------------------------------------------------
[ドキュメント] def rLine(self, lin): """Read Line method 読み取った1行を処理するメソッド 継続読み取り時にFalseを返す。 処理終了時にTrueを返す。 """ ppoint = self.p0.search(lin) if ppoint: self.foundCount += 1 coreName = ppoint.group(1) unitName = ppoint.group(2) curCount = ppoint.group(3) if self.debug: print unitName, curCount curCount_i = tryIntParse(curCount, 0) count = curCount_i - self.oldCount self.oldCount = curCount_i if unitName in self.sumDic: self.sumDic[unitName] += count else: self.unitCount += 1 self.sumDic[unitName] = count
#--------------------------------------------------------------------
[ドキュメント] def write(self): """write result 集計結果の書き出し. """ if self.verbose: print "Total # of ProfPoint(s): {0}".format(self.foundCount) print "Total # of Unit(s): {0}".format(self.unitCount) try: with open(self.oFname, 'w') as f: for uname, v in self.sumDic.items(): f.write(uname) f.write(",") f.write(str(v)) f.write("\n") except: stdExceptionHandler("Error: writing result file = " + self.oFname) return False return True
#======================================================================= # メインプログラム def main(): """main. メインプログラム """ #----------------------------------------------------------------------- # コマンドラインオプション処理 # parser = argparse.ArgumentParser(description='profHelper.') parser.add_argument('--LOG', nargs=1, help='LOG file name.') parser.add_argument('--CSV', nargs=1, help='CSV file name.') parser.add_argument('-d', dest='debug', help='print debug information.', action='store_true', default=False) parser.add_argument('-v', dest='verbose', help='Verbose mode.', action='store_true', default=False) parser.add_argument('-V', dest='VERSION', help='Show Version, then exit', action='store_true', default=False) args = parser.parse_args() #----------------------------------------------------------------------- # Version 表示 # print versionSTR if args.VERSION: sys.exit(0) #----------------------------------------------------------------------- # ファイル名処理 # if args.LOG is None: errPrint('ERROR: NO input LOG file!!!') sys.exit(1) else: logFname = args.LOG[0] if not os.path.isfile(logFname): errPrint('ERROR: LOG file, NOT EXIST.') sys.exit(1) if args.CSV is None: csvFname = "exec_log_counts.csv" else: csvFname = args.CSV[0] #----------------------------------------------------------------------- # パラメータ処理 #----------------------------------------------------------------------- # 実処理 # log = logReader(logFname, csvFname) log.verbose = args.verbose log.debug = args.debug # if log.read(): if not log.write(): sys.exit(1) else: sys.exit(1) #終了メッセージ today = datetime.today() print " " print today.strftime("FINISH: %Y/%m/%d %H:%M:%S") #----------------------------------------------------------------------- # 正常終了 # sys.exit(0) #======================================================================= # メインプログラムの起動 if __name__ == "__main__": main()