From bb822b901d8a4f94db1112cd73902b49aa9f147f Mon Sep 17 00:00:00 2001 From: erichmzhang Date: Fri, 8 Jun 2018 20:34:54 +0800 Subject: [PATCH] Add external log output --- QCloudCore/Classes/Logger/QCloudFileLogger.h | 5 ++-- QCloudCore/Classes/Logger/QCloudLogger.h | 27 ++++++++++++++++--- QCloudCore/Classes/Logger/QCloudLogger.m | 25 ++++++++++++++++- .../Classes/Logger/QCloudLoggerOutput.h | 12 +++++++++ .../Classes/Logger/QCloudLoggerOutput.m | 15 +++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 QCloudCore/Classes/Logger/QCloudLoggerOutput.h create mode 100644 QCloudCore/Classes/Logger/QCloudLoggerOutput.m diff --git a/QCloudCore/Classes/Logger/QCloudFileLogger.h b/QCloudCore/Classes/Logger/QCloudFileLogger.h index 52a20dd..4d9cea8 100644 --- a/QCloudCore/Classes/Logger/QCloudFileLogger.h +++ b/QCloudCore/Classes/Logger/QCloudFileLogger.h @@ -7,19 +7,18 @@ // #import - +#import "QCloudLoggerOutput.h" @class QCloudFileLogger; @protocol QCloudFileLoggerDelegate - (void) fileLoggerDidFull:(QCloudFileLogger*)logger; @end @class QCloudLogModel; -@interface QCloudFileLogger : NSObject +@interface QCloudFileLogger : QCloudLoggerOutput @property (nonatomic, weak) id delegate; @property (nonatomic, strong, readonly) NSString* path; @property (nonatomic, assign, readonly) uint64_t maxSize; @property (nonatomic, assign, readonly) uint64_t currentSize; @property (nonatomic, assign, readonly) BOOL isFull; - (instancetype) initWithPath:(NSString *)path maxSize:(uint64_t)maxSize; -- (void) appendLog:(QCloudLogModel*(^)(void))logCreate; @end diff --git a/QCloudCore/Classes/Logger/QCloudLogger.h b/QCloudCore/Classes/Logger/QCloudLogger.h index 6360d4c..54a8b46 100644 --- a/QCloudCore/Classes/Logger/QCloudLogger.h +++ b/QCloudCore/Classes/Logger/QCloudLogger.h @@ -8,6 +8,7 @@ #import #import "QCloudLogModel.h" +#import "QCloudLoggerOutput.h" #define QCloudLog(level, frmt, ...) \ [[QCloudLogger sharedLogger] logMessageWithLevel:level cmd:__PRETTY_FUNCTION__ line:__LINE__ file:__FILE__ format:(frmt), ##__VA_ARGS__] @@ -46,16 +47,19 @@ QCloudLog(QCloudLogLevelDebug,@"%@",[NSThread callStackSymbols]) @property (nonatomic, assign) uint64_t maxStoarageSize; @property (nonatomic, assign) float keepDays; + + + ///-------------------------------------- #pragma mark - Shared Logger ///-------------------------------------- /** - A shared instance of `PFLogger` that should be used for all logging. + A shared instance of `QCloudLogger` that should be used for all logging. - @return An shared singleton instance of `PFLogger`. + @return An shared singleton instance of `QCloudLogger`. */ -+ (instancetype)sharedLogger; //TODO: (nlutsenko) Convert to use an instance everywhere instead of a shared singleton. ++ (instancetype)sharedLogger; ///-------------------------------------- #pragma mark - Logging Messages @@ -67,4 +71,21 @@ QCloudLog(QCloudLogLevelDebug,@"%@",[NSThread callStackSymbols]) line:(int)line file:(const char*)file format:(NSString *)format, ...; + + + +/** + 增加一个输出源 + + @param output 输出源 + */ +- (void) addLogger:(QCloudLoggerOutput*)output; + + +/** + 删除一个输出源 + + @param output 删除一个输出源 + */ +- (void) removeLogger:(QCloudLoggerOutput*)output; @end diff --git a/QCloudCore/Classes/Logger/QCloudLogger.m b/QCloudCore/Classes/Logger/QCloudLogger.m index 9851c53..c7ada00 100644 --- a/QCloudCore/Classes/Logger/QCloudLogger.m +++ b/QCloudCore/Classes/Logger/QCloudLogger.m @@ -54,6 +54,9 @@ @interface QCloudLogger () @end @implementation QCloudLogger +{ + NSMutableArray* _loggerOutputs; +} + (instancetype)sharedLogger { @@ -85,8 +88,10 @@ - (instancetype) init if (!self) { return self; } + _loggerOutputs = [NSMutableArray new]; _currentFileLogger = [[QCloudFileLogger alloc] initWithPath:[self avilableLogFilePath] maxSize:QCloudEachLogFileSize]; _currentFileLogger.delegate = self; + [_loggerOutputs addObject:_currentFileLogger]; _maxStoarageSize = 70*1024*1024; _keepDays = 3; // @@ -113,6 +118,9 @@ - (instancetype) init - (void) fileLoggerDidFull:(QCloudFileLogger *)logger { + if (logger != _currentFileLogger) { + return; + } NSString* nextLogPath = [self avilableLogFilePath]; if (_currentFileLogger.isFull) { QCloudFileLogger * fileLogger =[[QCloudFileLogger alloc] initWithPath:nextLogPath maxSize:QCloudEachLogFileSize]; @@ -207,7 +215,22 @@ - (void)logMessageWithLevel:(QCloudLogLevel)level QCloudLogModel* model = CreateLog(); NSLog(@"%@",[model debugDescription]); } - [self.currentFileLogger appendLog:CreateLog]; + for (QCloudLoggerOutput* output in _loggerOutputs) { + [output appendLog:CreateLog]; + } va_end(args); } + +- (void) addLogger:(QCloudLoggerOutput *)output +{ + if (!output) { + return; + } + [_loggerOutputs addObject:output]; +} + +- (void) removeLogger:(QCloudLoggerOutput *)output +{ + [_loggerOutputs removeObject:output]; +} @end diff --git a/QCloudCore/Classes/Logger/QCloudLoggerOutput.h b/QCloudCore/Classes/Logger/QCloudLoggerOutput.h new file mode 100644 index 0000000..9332c24 --- /dev/null +++ b/QCloudCore/Classes/Logger/QCloudLoggerOutput.h @@ -0,0 +1,12 @@ +// +// QCloudLoggerOutput.h +// QCloudCore +// +// Created by Dong Zhao on 2018/5/29. +// + +#import +@class QCloudLogModel; +@interface QCloudLoggerOutput : NSObject +- (void) appendLog:(QCloudLogModel*(^)(void))logCreate; +@end diff --git a/QCloudCore/Classes/Logger/QCloudLoggerOutput.m b/QCloudCore/Classes/Logger/QCloudLoggerOutput.m new file mode 100644 index 0000000..f343ebb --- /dev/null +++ b/QCloudCore/Classes/Logger/QCloudLoggerOutput.m @@ -0,0 +1,15 @@ +// +// QCloudLoggerOutput.m +// QCloudCore +// +// Created by Dong Zhao on 2018/5/29. +// + +#import "QCloudLoggerOutput.h" + +@implementation QCloudLoggerOutput +- (void) appendLog:(QCloudLogModel *(^)(void))logCreate +{ + [NSException exceptionWithName:@"com.qcloud.logger" reason:@"You must implementation this method in subclass of QCloudLoggerOutput" userInfo:nil]; +} +@end