2011-10-26 13 views
13

Trong dự án iOS của tôi, tôi sử dụng một thư viện của bên thứ ba, đó là thư rác đáng kinh ngạc vào đầu ra của bàn điều khiển. Tôi có thể áp dụng bất kỳ bộ lọc nào để gỡ lỗi đầu ra hay không.Cách lọc đầu ra của bàn điều khiển trong Xcode

+1

Đây có thể không phải là giải pháp thực sự nhưng [MCLog] (https://github.com/yuhua-chen/MCLog) là một plugin XCode cho phép lọc đầu ra. – david

+0

@david Thx, tôi nên chấp nhận nhận xét này là câu trả lời hay nhất, vì 'MCLog' thực hiện chính xác những gì tôi cần. – ArtFeel

+0

l đã sao chép nhận xét của tôi làm câu trả lời rồi. – david

Trả lời

4

Nếu thư viện đang sử dụng NSLog, bạn có thể xác định lại và hủy thông báo tường trình khi thư đến từ thư viện. Mã ví dụ:

#define NSLog(args...) [[Logger singleton] debugWithLevel:kDebug line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args]; 

// poor man's nslog 
@interface Logger : NSObject 

typedef enum { 
    kTrace=0, kDebug=1, kInfo=2, kWarn=3, kError=4, KSilent=5 
} LoggerLevel; 


// ... 

@implementation Logger 

+(Logger *)singleton { 
    static dispatch_once_t pred; 
    static Logger *shared = nil; 
    dispatch_once(&pred, ^{ 
     shared = [[Logger alloc] init]; 
     shared.logThreshold = kTrace; 
    }); 
    return shared; 
} 
-(void) debugWithLevel:(LoggerLevel)level 
        line:(int)line 
       funcName:(const char *)funcName 
       message:(NSString *)msg, ... { 

    va_list ap;   
    va_start (ap, msg); 
    msg = [[[NSString alloc] initWithFormat:msg arguments:ap] autorelease]; 
    va_end (ap);   

    msg = [NSString stringWithFormat:@"%s %50s:%3d - %@", levelName[level], funcName, line, msg]; 

    // ... filter by class name ... 

    fprintf(stdout,"%s\n", [msg UTF8String]); 
} 
@end 

Lưu ý rằng funcName chứa tên và phương thức gửi thư. Nếu thư viện là một công dân tốt và có các lớp bắt đầu bằng một tiền tố, hãy loại bỏ đầu ra nếu className bắt đầu với nó. Nếu không, bạn phải tải danh sách các lớp từ thư viện đó và kiểm tra chúng trước dòng fprintf.

Điều này tất nhiên, không trùng lặp nhật ký với syslogd như NSLog, nhưng ai quan tâm. : P

3

Tùy thuộc vào việc bạn đang sử dụng trực tiếp mã nguồn thư viện của bên thứ ba trong dự án hay thư viện nhị phân.

Nếu bạn đang sử dụng mã nguồn, tôi khuyên bạn nên kiểm tra những gì họ đang sử dụng để ghi nhật ký thư. Nó có thể có một cách để giảm độ dài. Nếu họ đang sử dụng đơn giản NSLog, tùy chọn duy nhất sẽ là xác định lại NSLog để thực hiện một số lọc, như Jano đã đề xuất bạn.

Nếu họ đang sử dụng chức năng ở mức độ thấp như printf và như thế, lựa chọn tốt nhất của bạn là để thay thế chúng với riêng vĩ mô tùy chỉnh khai thác gỗ của bạn, như:

#ifdef DEBUG_3P 
    #define LOG_3P(str) NSLog(@"%s", str) 
#else 
    #define LOG_3P(str) /* nothing */ 
#endif 

Sau đó, thay thế printf("a c string message") với LOG_3P("a c string message"). Bạn sẽ cần phải tùy chỉnh giải pháp, điều chỉnh thông số macro hoặc thậm chí thêm nhiều macro cho trường hợp của bạn. Và thực hiện một vài tìm kiếm và thay thế cho đến khi nó hoạt động.

Khi bạn muốn xem nhật ký thư viện của bên thứ ba, chỉ cần xác định DEBUG_3P trong cài đặt bản dựng của bạn làm cờ C: -D DEBUG_3P, nếu không nó sẽ bị tắt tiếng.

Nếu bạn đang sử dụng thư viện nhị phân, bạn chỉ có thể xây dựng nó bằng cấu hình phát hành, tắt hoặc giảm độ dài của nhật ký ở mức tối thiểu.

+0

Tôi sử dụng thư viện mã nguồn được viết bằng C và nó sử dụng printf(), vprintf() và puts() để ghi nhật ký. – ArtFeel

+0

Trong trường hợp đó, trừ khi bạn thay thế chúng bằng macro ghi nhật ký của riêng bạn, tôi sợ bạn không thể * dễ dàng * chặn đầu ra. Xem câu trả lời cập nhật của tôi. – djromero

3

Đối với Swift, tôi đã viết một trình bao bọc xung quanh print() chỉ thực hiện việc này. Xem tại đây: https://github.com/SebastianMecklenburg/TagLog

Tính năng này hoạt động bằng cách thêm thẻ để gỡ lỗi thư rồi lọc kết quả bằng các thẻ đó. Nó hoạt động tất cả trong mã và không cần một plugin Xcode.

+0

Điều này sẽ lọc ra văn bản bên thứ 3 được gửi đến bàn điều khiển thông qua lệnh 'print()'? –