SystemLogger.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file SystemLogger.py
00006 # @brief RT component logger class
00007 # @date $Date$
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2003-2008
00011 #     Task-intelligence Research Group,
00012 #     Intelligent Systems Research Institute,
00013 #     National Institute of
00014 #         Advanced Industrial Science and Technology (AIST), Japan
00015 #     All rights reserved.
00016 
00017 
00018 import time
00019 import threading
00020 import logging
00021 import logging.handlers
00022 
00023 logger = None
00024 
00025 ##
00026 # @if jp
00027 # @class ScopedLock
00028 # @brief ScopedLock クラス
00029 #
00030 # 排他処理用ロッククラス。
00031 #
00032 # @since 0.4.0
00033 #
00034 # @else
00035 #
00036 # @endif
00037 class ScopedLock:
00038   def __init__(self, mutex):
00039     self.mutex = mutex
00040     self.mutex.acquire()
00041 
00042   def __del__(self):
00043     self.mutex.release()
00044 
00045 
00046 ##
00047 # @if jp
00048 #
00049 # @class Logbuf
00050 #
00051 # @brief ロガーバッファダミークラス
00052 #
00053 # ログバッファのダミークラス。
00054 #
00055 # @else
00056 #
00057 # @class Logbuf
00058 #
00059 # @brief Logger buffer dummy class
00060 #
00061 # @endif
00062 class Logbuf:
00063 
00064 
00065 
00066   ##
00067   # @if jp
00068   #
00069   # @brief コンストラクタ
00070   #
00071   # ファイル名およびオープンモードを指定してコンストラクトするコンストラクタ
00072   #
00073   # @param self
00074   # @param fileName ログファイル名(デフォルト値:None)
00075   # @param mode オープンモード(デフォルト値:None)
00076   # @param protection 保護モード(デフォルト値:a+)本実装では未使用
00077   #
00078   # @else
00079   #
00080   # @brief constructor.
00081   #
00082   # @endif
00083   def __init__(self, fileName=None, mode=None, protection='a+'):
00084     global logger
00085     self._mutex = threading.RLock()
00086 
00087     logger = logging.getLogger('rtclog')
00088 
00089     if fileName:
00090       self._fhdlr = logging.FileHandler(fileName)
00091     else:
00092       self._fhdlr = logging.FileHandler('rtcsystem.log')
00093 
00094 
00095   ##
00096   # @if jp
00097   #
00098   # @brief デストラクタ
00099   #
00100   # デストラクタ。ファイルをクローズする。
00101   #
00102   # @param self
00103   #
00104   # @else
00105   #
00106   # @brief destractor.
00107   #
00108   # @endif
00109   def __del__(self):
00110     self._fhdlr.close()
00111 
00112 
00113 
00114 ##
00115 # @if jp
00116 #
00117 # @class LogStream
00118 #
00119 # @brief ロガーフォーマットダミークラス
00120 #
00121 # ログフォーマット用ダミークラス。
00122 #
00123 # @else
00124 #
00125 # @endif
00126 class LogStream:
00127 
00128 
00129 
00130   SILENT    = 0 # ()
00131   ERROR     = 1 # (ERROR)
00132   WARN      = 2 # (ERROR, WARN)
00133   INFO      = 3 # (ERROR, WARN, INFO)
00134   NORMAL    = 4 # (ERROR, WARN, INFO, NORMAL)
00135   DEBUG     = 5 # (ERROR, WARN, INFO, NORMAL, DEBUG)
00136   TRACE     = 6 # (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE)
00137   VERBOSE   = 7 # (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE)
00138   PARANOID  = 8 # (ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARA)
00139   MANDATORY = 9 #  This level is used for only LogLockLevel
00140 
00141 
00142   ##
00143   # @if jp
00144   #
00145   # @brief ログレベル設定
00146   #
00147   # 与えられた文字列に対応したログレベルを設定する。
00148   #
00149   # @param self
00150   # @param lv ログレベル文字列
00151   #
00152   # @return 設定したログレベル
00153   #
00154   # @else
00155   #
00156   # @endif
00157   def strToLogLevel(self, lv):
00158     if lv == LogStream.SILENT:
00159       return LogStream.SILENT
00160     elif lv == LogStream.ERROR:
00161       return LogStream.ERROR
00162     elif lv == LogStream.WARN:
00163       return LogStream.WARN
00164     elif lv == LogStream.INFO:
00165       return LogStream.INFO
00166     elif lv == LogStream.NORNAL:
00167       return LogStream.NORMAL
00168     elif lv == LogStream.DEBUG:
00169       return LogStream.DEBUG
00170     elif lv == LogStream.TRACE:
00171       return LogStream.TRACE
00172     elif lv == LogStream.VERBOSE:
00173       return LogStream.VERBOSE
00174     elif lv == LogStream.PARANOID:
00175       return LogStream.PARANOID
00176     elif lv == LogStream.MANDATORY:
00177       return LogStream.MANDATORY
00178     else:
00179       return LogStream.NORMAL
00180 
00181 
00182   ##
00183   # @if jp
00184   #
00185   # @brief コンストラクタ
00186   #
00187   # コンストラクタ
00188   #
00189   # @param self
00190   # @param logbufObj ログバッファオブジェクト(デフォルト値:None)
00191   #
00192   # @else
00193   #
00194   # @brief constructor.
00195   #
00196   # @endif
00197   def __init__(self, logbufObj=None):
00198     global logger
00199     self._mutex = threading.RLock()
00200     self._LogLock = False
00201     self._log_enable = False
00202     if logbufObj:
00203       formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
00204       self._pLogbuf = logbufObj
00205       fh = self._pLogbuf._fhdlr
00206       self._mhdlr = logging.handlers.MemoryHandler(1024,logging.DEBUG, fh)
00207       fh.setFormatter(formatter)
00208       logger.addHandler(self._mhdlr)
00209       logger.setLevel(logging.DEBUG)
00210       self._log_enable = True
00211 
00212 
00213   ##
00214   # @if jp
00215   #
00216   # @brief printf フォーマット出力
00217   #
00218   # printfライクな書式でログ出力する。<br>
00219   # ※本実装では引数 fmt で与えられた文字をそのまま返す。
00220   #
00221   # @param self
00222   # @param fmt 書式文字列
00223   #
00224   # @return 書式付き文字列出力
00225   #
00226   # @else
00227   #
00228   # @brief Formatted output like printf
00229   #
00230   # @endif
00231   def printf(self, fmt):
00232     return fmt
00233 
00234 
00235   ##
00236   # @if jp
00237   #
00238   # @brief ログレベル設定
00239   #
00240   # ログレベルを設定する。
00241   #
00242   # @param self
00243   # @param level ログレベル
00244   #
00245   # @else
00246   #
00247   # @endif
00248   def setLogLevel(self, level):
00249     global logger
00250 
00251     if level == "INFO":
00252       logger.setLevel(logging.INFO)
00253     elif level == "ERROR":
00254       logger.setLevel(logging.ERROR)
00255     elif level == "WARNING":
00256       logger.setLevel(logging.WARNING)
00257     elif level == "DEBUG":
00258       logger.setLevel(logging.DEBUG)
00259     elif level == "SILENT":
00260       logger.setLevel(logging.NOTSET)
00261     else:
00262       logger.setLevel(logging.INFO)
00263 
00264 
00265   ##
00266   # @if jp
00267   #
00268   # @brief ロックモード設定
00269   #
00270   # ログのロックモードを設定する。
00271   #
00272   # @param self
00273   # @param lock ログロックフラグ
00274   #
00275   # @else
00276   #
00277   # @endif
00278   def setLogLock(self, lock):
00279     if lock == 1:
00280       self._LogLock = True
00281     elif lock == 0:
00282       self._LogLock = False
00283 
00284 
00285   ##
00286   # @if jp
00287   #
00288   # @brief ロックモード有効化
00289   #
00290   # @param self
00291   #
00292   # ロックモードを有効にする。
00293   #
00294   # @else
00295   #
00296   # @endif
00297   def enableLogLock(self):
00298     self._LogLock = True
00299 
00300 
00301   ##
00302   # @if jp
00303   #
00304   # @brief ロックモード解除
00305   #
00306   # @param self
00307   #
00308   # ロックモードを無効にする。
00309   #
00310   # @else
00311   #
00312   # @endif
00313   def disableLogLock(self):
00314     self._LogLock = False
00315 
00316 
00317   ##
00318   # @if jp
00319   #
00320   # @brief ログロック取得
00321   # ロックモードが設定されている場合、ログのロックを取得する。
00322   #
00323   # @param self
00324   #
00325   # @else
00326   #
00327   # @endif
00328   def acquire(self):
00329     if self._LogLock:
00330       self.guard = ScopedLock(self._mutex)
00331 
00332 
00333   ##
00334   # @if jp
00335   #
00336   # @brief ログロック解放
00337   # ロックモードが設定されている場合に、ログのロックを解放する。
00338   #
00339   # @param self
00340   #
00341   # @else
00342   #
00343   # @endif
00344   def release(self):
00345     if self._LogLock:
00346       del self.guard
00347 
00348 
00349   ##
00350   # @if jp
00351   #
00352   # @brief 汎用ログ出力
00353   #
00354   # ログレベルおよび出力フォーマット文字列を引数としてとり,
00355   # 汎用ログを出力する。
00356   #
00357   # @param self
00358   # @param LV ログレベル
00359   # @param msg ログメッセージ
00360   # @param opt オプション(デフォルト値:None)
00361   #
00362   # @else
00363   #
00364   # @brief Log output macro
00365   #
00366   # @endif
00367   def RTC_LOG(self, LV, msg, opt=None):
00368     global logger
00369 
00370     if self._log_enable:
00371       self.acquire()
00372 
00373       if opt:
00374         try:
00375           messages = msg%(opt)
00376         except:
00377           print "RTC_LOG : argument error"
00378           return
00379       else:
00380         messages = msg
00381 
00382       logger.log(LV,messages)
00383 
00384       self.release()
00385 
00386 
00387   ##
00388   # @if jp
00389   #
00390   # @brief エラーログ出力
00391   #
00392   # エラーレベルのログを出力する。<BR>ログレベルが
00393   # ERROR, WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARANOID
00394   # の場合にログ出力される。
00395   #
00396   # @param self
00397   # @param msg ログメッセージ
00398   # @param opt オプション(デフォルト値:None)
00399   #
00400   # @else
00401   #
00402   # @brief Error log output macro.
00403   #
00404   # @endif
00405   def RTC_ERROR(self, msg, opt=None):
00406     global logger
00407 
00408     if self._log_enable:
00409       self.acquire()
00410 
00411       if opt:
00412         try:
00413           messages = msg%(opt)
00414         except:
00415           print "RTC_ERROR : argument error"
00416           return
00417       else:
00418         messages = msg
00419 
00420       logger.error(messages)
00421 
00422       self.release()
00423 
00424 
00425   ##
00426   # @if jp
00427   #
00428   # @brief ワーニングログ出力
00429   #
00430   # ワーニングレベルのログを出力する。<BR>ログレベルが
00431   # ( WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARANOID )
00432   # の場合にログ出力される。
00433   #
00434   # @param self
00435   # @param msg ログメッセージ
00436   # @param opt オプション(デフォルト値:None)
00437   #
00438   # @else
00439   #
00440   # @brief Warning log output macro.
00441   #
00442   # If logging levels are
00443   # ( WARN, INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARANOID ),
00444   # message will be output to log.
00445   #
00446   # @endif
00447   def RTC_WARN(self, msg, opt=None):
00448     global logger
00449 
00450     if self._log_enable:
00451       self.acquire()
00452 
00453       if opt:
00454         try:
00455           messages = msg%(opt)
00456         except:
00457           print "RTC_WARN : argument error"
00458           return
00459       else:
00460         messages = msg
00461 
00462       logger.warning(messages)
00463 
00464       self.release()
00465 
00466 
00467   ##
00468   # @if jp
00469   #
00470   # @brief インフォログ出力
00471   #
00472   # インフォレベルのログを出力する。<BR>ログレベルが
00473   # ( INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARANOID )
00474   # の場合にログ出力される。
00475   #
00476   # @param self
00477   # @param msg ログメッセージ
00478   # @param opt オプション(デフォルト値:None)
00479   #
00480   # @else
00481   #
00482   # @brief Infomation level log output macro.
00483   #
00484   #  If logging levels are
00485   # ( INFO, NORMAL, DEBUG, TRACE, VERBOSE, PARANOID ),
00486   # message will be output to log.
00487   #
00488   # @endif
00489   def RTC_INFO(self, msg, opt=None):
00490     global logger
00491 
00492     if self._log_enable:
00493       self.acquire()
00494 
00495       if opt:
00496         try:
00497           messages = msg%(opt)
00498         except:
00499           print "RTC_INFO : argument error"
00500           return
00501       else:
00502         messages = msg
00503 
00504       logger.info(messages)
00505     
00506       self.release()
00507 
00508 
00509   ##
00510   # @if jp
00511   #
00512   # @brief ノーマルログ出力
00513   #
00514   # ノーマルレベルのログを出力する。<BR>ログレベルが
00515   # ( NORMAL, DEBUG, TRACE, VERBOSE, PARANOID )
00516   # の場合にログ出力される。
00517   #
00518   # @param self
00519   # @param msg ログメッセージ
00520   # @param opt オプション(デフォルト値:None)
00521   #
00522   # @else
00523   #
00524   # @brief Normal level log output macro.
00525   #
00526   # If logging levels are
00527   # ( NORMAL, DEBUG, TRACE, VERBOSE, PARANOID ),
00528   # message will be output to log.
00529   #
00530   # @endif
00531   def RTC_NORMAL(self, msg, opt=None):
00532     return
00533 
00534     global logger
00535 
00536     if self._log_enable:
00537       self.acquire()
00538 
00539       if opt:
00540         try:
00541           messages = msg%(opt)
00542         except:
00543           print "RTC_NORMAL : argument error"
00544           return
00545       else:
00546         messages = msg
00547         
00548       self.release()
00549 
00550 
00551   ##
00552   # @if jp
00553   #
00554   # @brief デバッグログ出力
00555   #
00556   # デバッグレベルのログを出力する。<BR>ログレベルが
00557   # ( DEBUG, TRACE, VERBOSE, PARANOID )
00558   # の場合にログ出力される。
00559   #
00560   # @param self
00561   # @param msg ログメッセージ
00562   # @param opt オプション(デフォルト値:None)
00563   #
00564   # @else
00565   #
00566   # @brief Debug level log output macro.
00567   #
00568   # If logging levels are
00569   # ( DEBUG, TRACE, VERBOSE, PARANOID ),
00570   # message will be output to log.
00571   #
00572   # @endif
00573   def RTC_DEBUG(self, msg, opt=None):
00574     global logger
00575 
00576     if self._log_enable:
00577       self.acquire()
00578 
00579       if opt:
00580         try:
00581           messages = msg%(opt)
00582         except:
00583           print "RTC_DEBUG : argument error"
00584           return
00585       else:
00586         messages = msg
00587         
00588       logger.debug(messages)
00589       
00590       self.release()
00591 
00592 
00593   ##
00594   # @if jp
00595   #
00596   # @brief トレースログ出力
00597   #
00598   # トレースレベルのログを出力する。<BR>ログレベルが
00599   # ( TRACE, VERBOSE, PARANOID )
00600   # の場合にログ出力される。
00601   #
00602   # @param self
00603   # @param msg ログメッセージ
00604   # @param opt オプション(デフォルト値:None)
00605   #
00606   # @else
00607   #
00608   # @brief Trace level log output macro.
00609   #
00610   # If logging levels are
00611   # ( TRACE, VERBOSE, PARANOID ),
00612   # message will be output to log.
00613   #
00614   # @endif
00615   def RTC_TRACE(self, msg, opt=None):
00616     global logger
00617 
00618     if self._log_enable:
00619       self.acquire()
00620 
00621       if opt:
00622         try:
00623           messages = msg%(opt)
00624         except:
00625           print "RTC_TRACE : argument error"
00626           return
00627       else:
00628         messages = msg
00629         
00630       logger.debug(messages)
00631       
00632       self.release()
00633 
00634 
00635   ##
00636   # @if jp
00637   #
00638   # @brief ベルボーズログ出力
00639   #
00640   # ベルボーズレベルのログを出力する。<BR>ログレベルが
00641   # ( VERBOSE, PARANOID )
00642   # の場合にログ出力される。<br>
00643   # ※現状では未実装
00644   #
00645   # @param self
00646   # @param msg ログメッセージ
00647   # @param opt オプション(デフォルト値:None)
00648   #
00649   # @else
00650   #
00651   # @brief Verbose level log output macro.
00652   #
00653   # If logging levels are
00654   # ( VERBOSE, PARANOID ),
00655   # message will be output to log.
00656   #
00657   # @endif
00658   def RTC_VERBOSE(self, msg, opt=None):
00659     pass
00660 
00661 
00662   ##
00663   # @if jp
00664   #
00665   # @brief パラノイドログ出力
00666   #
00667   # パラノイドレベルのログを出力する。<BR>ログレベルが
00668   # ( PARANOID )
00669   # の場合にログ出力される。<br>
00670   # ※現状では未実装
00671   #
00672   # @param self
00673   # @param msg ログメッセージ
00674   # @param opt オプション(デフォルト値:None)
00675   #
00676   # @else
00677   #
00678   # @brief Paranoid level log output macro.
00679   #
00680   # If logging levels are
00681   # ( PARANOID ),
00682   # message will be output to log.
00683   #
00684   # @endif
00685   def RTC_PARANOID(self, msg, opt=None):
00686     pass

OpenRTMに対してMon Mar 17 15:11:06 2008に生成されました。  doxygen 1.5.4