2011-01-14 37 views
8

Có một số cách tương đối đơn giản để lập trình bao gồm các dòng mã nguồn để báo cáo logger python. Ví dụ:Làm thế nào để in dòng mã nguồn trong logger python

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?') 

Vì vậy, kết quả sẽ trông như thế này.

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

doesn' t đã làm điều đó? – marcog

+0

@marcog Xin lỗi vì tôi không thể giải thích rõ vấn đề của tôi. TryPyPy và unutbu hiểu những gì tôi đang tìm kiếm. Hy vọng rằng câu trả lời của họ giải thích những gì tôi đã sau. – ojs

+0

Tôi cũng đưa ra giả định tương tự như marcog và không thể hiểu được vấn đề là gì. Có lẽ chỉnh sửa câu hỏi của bạn để đọc "lập trình bao gồm các dòng mã nguồn _arbitrary_, không chỉ dòng ghi nhật ký" –

Trả lời

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() 

sản lượng

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

Ồ, điều này đang kêu lên cho ____file____ đơn giản và ____line____ (không có bất kỳ nội dung kiểm tra/khung hiện hành nào). – jarmod

+0

+1 từ tôi - không bao giờ biết về 'linecache'. –

4

Chỉ vì tôi thấy unutbu thử một cái gì đó tương tự, đây là đoạn code tôi đã đưa ra (quá muộn để gửi khác):

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() 
Các vấn đề liên quan