2015-01-27 19 views
5

Các nhật ký tôi đang tạo bằng Python được dự định sẽ được lưu tạm thời dưới dạng các tệp sẽ lần lượt được xử lý thành cơ sở dữ liệu nhật ký. Chúng có định dạng được phân định theo đường ống để chỉ ra cách nhật ký sẽ được xử lý, nhưng logging.exception() đang phá vỡ tiêu chuẩn của tôi bằng cách thêm một trường quá nhiều và quá nhiều dòng mới.Làm cách nào để có thể định dạng stacktraces ngoại lệ trong ghi nhật ký Python?

import logging 
logging.basicConfig(filename='output.txt', 
        format='%(asctime)s|%(levelname)s|%(message)s|', 
        datefmt='%m/%d/%Y %I:%M:%S %p', 
        level=logging.DEBUG) 
logging.info('Sample message') 

try: 
    x = 1/0 
except ZeroDivisionError as e: 
    logging.exception('ZeroDivisionError: {0}'.format(e)) 

# output.txt 
01/27/2015 02:09:01 PM|INFO|Sample message| 
01/27/2015 02:09:01 PM|ERROR|ZeroDivisionError: integer division or modulo by zero| 
Traceback (most recent call last): 
    File "C:\Users\matr06586\Desktop\ETLstage\Python\blahblah.py", line 90, in <module> 
    x = 1/0 
ZeroDivisionError: integer division or modulo by zero 

Làm cách nào để xử lý tốt nhất hoặc định dạng tracebacks với khoảng trắng và dòng mới? Những thông điệp này là một phần và bưu kiện trong logging.exception(), nhưng nó cảm thấy kỳ quặc để phá vỡ chức năng khi tôi đang cố gắng ghi lại các trường hợp ngoại lệ. Làm thế nào để tôi ghi lại các bản nhạc của tôi và định dạng chúng? Các tracebacks có nên bỏ qua không?

Cảm ơn bạn đã dành thời gian!

+0

Bạn có hỏi bạn nên làm gì không, hoặc làm thế nào để làm điều đó? Cách bạn muốn định dạng các thông báo lỗi trong tệp nhật ký của mình tùy thuộc vào bạn. * Bạn * muốn chúng trông như thế nào? – BrenBarn

+0

Cảm ơn bạn đã xóa thông tin đó. Lý tưởng nhất, tôi có thể chứa các tracebacks như một thuộc tính được phân cách bằng đường ống trên cùng một dòng với phần còn lại của thông điệp đã đăng nhập. – twoxmachine

Trả lời

5

Bạn có thể xác định riêng Formatter có phương pháp bạn có thể ghi đè thông tin định dạng ngoại lệ chính xác như bạn muốn nó của bạn. Đây là một đơn giản (nhưng làm việc) ví dụ:

import logging 

class OneLineExceptionFormatter(logging.Formatter): 
    def formatException(self, exc_info): 
     result = super(OneLineExceptionFormatter, self).formatException(exc_info) 
     return repr(result) # or format into one line however you want to 

    def format(self, record): 
     s = super(OneLineExceptionFormatter, self).format(record) 
     if record.exc_text: 
      s = s.replace('\n', '') + '|' 
     return s 

fh = logging.FileHandler('output.txt', 'w') 
f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|', '%m/%d/%Y %I:%M:%S %p') 
fh.setFormatter(f) 
root = logging.getLogger() 
root.setLevel(logging.DEBUG) 
root.addHandler(fh) 
logging.info('Sample message') 

try: 
    x = 1/0 
except ZeroDivisionError as e: 
    logging.exception('ZeroDivisionError: {0}'.format(e)) 

này tạo ra chỉ hai dòng:

01/28/2015 07:28:27 AM|INFO|Sample message| 
01/28/2015 07:28:27 AM|ERROR|ZeroDivisionError: integer division or modulo by zero|'Traceback (most recent call last):\n File "logtest2.py", line 23, in <module>\n x = 1/0\nZeroDivisionError: integer division or modulo by zero'| 

Tất nhiên, bạn có thể xây dựng trên ví dụ này để làm chính xác những gì bạn muốn, ví dụ thông qua mô-đun traceback.

0

Bạn nên xác định chức năng của riêng bạn mà sử dụng traceback.extract_tb để định dạng traceback với cú pháp mà bạn muốn và sau đó trả lại hoặc ghi nó vào một tập tin:

traceback.extract_tb(traceback[, limit]) 

Return một danh sách lên để hạn chế “trước các mục dấu vết ngăn xếp được xử lý được trích xuất từ ​​truy xuất traceback đối tượng traceback. Nó rất hữu ích cho việc định dạng thay thế các dấu vết ngăn xếp. Nếu giới hạn bị bỏ qua hoặc Không, tất cả các mục được trích xuất. Mục nhập theo dõi ngăn xếp “được xử lý trước” là một 4-tuple (tên tệp, số dòng, tên hàm, văn bản) thể hiện thông tin thường được in cho một dấu vết ngăn xếp. Văn bản là một chuỗi có khoảng trắng đầu và cuối bị tước; nếu nguồn không có sẵn, nó là None.

https://docs.python.org/2/library/traceback.html

Các vấn đề liên quan