2012-10-16 48 views
7

Tôi đang sử dụng khung công tác CocoaLumberjack này để đăng nhập tất cả các thư của tôi trong thiết kế Objective-C. Bây giờ tôi muốn đăng nhập tất cả các lỗi vào một tập tin và tất cả các tin nhắn khác vào một tập tin khác. Tôi biết tôi có thể sử dụng trình định dạng để lọc thông tin này. Tôi đã tạo hai cá thể DDFileLogger trong AppDelegate nhưng hai logger này vẫn tiếp tục ghi vào cùng một tệp. Tôi tự hỏi, nếu có một cách mà tôi có thể chỉ định các điểm đến đăng nhập để hai logger ghi vào hai tập tin khác nhau.CocoaLumberjack FileLogger đăng nhập vào nhiều tệp

+0

Tôi đang gặp vấn đề tương tự. Đã thử cách tiếp cận trong [bài đăng này] (http://stackoverflow.com/a/7762344/264775), nhưng nó không hoạt động trên thiết bị hoặc trình mô phỏng. Bạn có tìm cách tiếp cận làm việc không? – thegrinner

+0

Chúng tôi có thể có một tài liệu hoặc một liên kết mà tôi có được hướng dẫn từng bước về việc tích hợp Cocoalumberjack với Hockey trong dự án SWIFT 2.2. Tất cả các liên kết và trang web ứng dụng hockey cho thấy tất cả việc triển khai trong mục tiêu-c. Cảm ơn! – Tejas

Trả lời

7

Chìa khóa để làm việc này là thiết lập từng DDFileLogger với DDLogFileManager của riêng nó, với các đường dẫn thư mục nhật ký riêng biệt cho mỗi. DDLogFileManager sử dụng đường dẫn thư mục log để xác định tệp cần đăng nhập, vì vậy nếu bạn có hai tệp trỏ đến cùng một thư mục, chúng sẽ đăng nhập vào cùng một tệp nhật ký. Vì vậy, điều quan trọng là sử dụng các thư mục riêng biệt cho mỗi nhật ký.

Đối với hai loại bản ghi khác nhau: "One" và "Hai":

// Set the base log directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"]; 

// set up file logger One to log to subdirectory "One" 
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]]; 
DDFileLogger *loggerOne = [[DDFileLogger alloc] fileManagerOne]; 

// Use the filter formatter to make sure only "One" logs go to the "One" log files 
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterOne addToWhitelist:LOG_CONTEXT_ONE]; 
[loggerOne formatterOne]; 

[DDLog loggerOne]; 

    // set up file logger Two to log to subdirectory "Two" 
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]]; 
DDFileLogger *loggerTwo = [[DDFileLogger alloc] fileManagerTwo]; 

// Use the filter formatter to make sure only "Two" logs go to the "Two" log files 
ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO]; 
[loggerTwo formatterTwo]; 

[DDLog loggerTwo]; 

thì tất nhiên bạn vẫn cần phải xác định macro để làm đăng nhập của bạn:

#define LOG_CONTEXT_ONE 1 
#define LOG_CONTEXT_TWO 2 

#define LogOne(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_ONE, frmt, ##__VA_ARGS__) 
#define LogTwo(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_TWO, frmt, ##__VA_ARGS__) 

Đây là những gì làm việc cho tôi.

+0

Bạn cũng có thể đơn giản hóa điều này bằng cách sử dụng ngữ cảnh mặc định 0 và thêm mã loggerOne. Sau đó bạn chỉ cần thêm DDContextWhitelistFilterLogFormatter cho ngữ cảnh 0 vào trình ghi tệp mặc định của bạn. – dbainbridge

+0

Tuyên bố ngầm định của SYNC_LOG_OBJC_MACRO không được phép trong c99. Bất cứ ai có thể giúp đỡ về điều này? –

0

Bạn có thể đạt được điều gì đó rất gần bằng cách sử dụng tính năng mới (mức nhật ký khác nhau cho mỗi trình ghi nhật ký). Xem https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Tạo 2 trình ghi nhật ký tệp (một trình có mức lỗi và phần còn lại có chi tiết) sẽ không chính xác như bạn đã mô tả, vì các nhật ký lỗi sẽ đi vào cả hai tệp. Điều này có đủ tốt không?

+0

Tôi cũng cần điều này nhưng điều quan trọng là phải đăng nhập vào các tệp riêng biệt. Vì vậy, có nó đi vào cả hai tập tin đánh bại mục đích của tôi ít nhất. – dbainbridge

2

tôi không có đủ uy tín để nhận xét về câu trả lời hàng đầu phía trên, nhưng đây là một phiên bản của câu trả lời KabukiAdam rằng làm việc với các CocoaLumberjack mới nhất:

// Set the base log directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"]; 

// set up file logger One to log to subdirectory "One" 
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]]; 
DDFileLogger *loggerOne = [[DDFileLogger alloc] initWithLogFileManager:fileManagerOne]; 

// Use the filter formatter to make sure only "One" logs go to the "One" log files 
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterOne addToWhitelist:LOG_CONTEXT_ONE]; 
[loggerOne setLogFormatter:formatterOne]; 
[DDLog addLogger:loggerOne]; 

// set up file logger One to log to subdirectory "Two" 
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]]; 
DDFileLogger *loggerTwo = [[DDFileLogger alloc] initWithLogFileManager:fileManagerTwo]; 

// Use the filter formatter to make sure only "Two" logs go to the "Two" log files ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO]; 
[loggerTwo setLogFormatter:formatterTwo]; 
[DDLog addLogger:loggerTwo]; 
+0

Tuyên bố ngầm định của SYNC_LOG_OBJC_MACRO không được phép trong c99. Bất cứ ai có thể giúp đỡ về điều này? –

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