2011-01-14 17 views
8

python logger reportにソースコード行をプログラムで組み込む比較的簡単な方法はありますか?たとえば...python loggerでソースコード行を印刷するには

import logging 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     logging.debug('some way to get previous line of source code here?') 

出力は次のようになります。

example.py: DEBUG: main(): 14:  if something_is_not_right == True: 
+0

doesnの」それはすでにそれだけですか? – marcog

+0

@marcog私の問題をより明確に説明できないのは残念です。 TryPyPyとunutbuは私が探していたものを理解していました。うまくいけば彼らの答えは私が何をしていたのかを説明します – ojs

+0

私もmarcogと同じ仮定をして、問題が何かを理解できませんでした。おそらく、あなたの質問を編集して、 "ログに記録された行だけではなく、プログラム上に_arbitrary_ソースコード行を含める"ようにしてください。 –

答えて

12
import inspect 
import logging 
import linecache 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: '  
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right: 
     logging.debug(linecache.getline(
      __file__, 
      inspect.getlineno(inspect.currentframe())-1)) 

if __name__=='__main__': 
    main() 

利回り

test.py: DEBUG: main(): 18:  if something_is_not_right == True: 
+0

うわー、これは単純な____file____と____line____(inspect/currentframeのものはありません) – jarmod

+0

+1私から - 'linecache'について知りませんでした。 –

4

私はunutbuが同様の何かを試みる見たという理由だけで、ここで私は(そうでない場合は投稿するには遅すぎる)を思い付いたコードは次のとおりです。

import logging, sys 

# From logging.py 
def currentframe(): 
    """Return the frame object for the caller's stack frame.""" 
    try: 
     raise Exception 
    except: 
     return sys.exc_traceback 

f = open(__file__.rstrip('c')) 
owncode = f.readlines() 
f.close() 

def main(): 
    something_is_not_right = True 
    logging.basicConfig(level=logging.DEBUG, 
         format=('%(filename)s: ' 
           '%(levelname)s: ' 
           '%(funcName)s(): ' 
           '%(lineno)d:\t' 
           '%(message)s') 
         ) 

    if something_is_not_right == True: 
     prev = owncode[currentframe().tb_frame.f_back.f_lineno - 2] 
     logging.debug('previous line of source code here:\n%s' % prev) 

if __name__ == '__main__': 
    main()