CocoaLumberjack - 通过子类化 LogFileManager 更改日志文件名

CocoaLumberjack - change log file name by subclassing the LogFileManager

我正在尝试更改日志文件名。到目前为止我发现的是 this.

我的 DDLogFileManagerDefault 子类如下所示:

LogFileManager.h

@import CocoaLumberjack;

// this import would work as well
// #import <CocoaLumberjack/CocoaLumberjack.h> 

// but none of these
//#import "DDLog.h"
//#import "DDTTYLogger.h"
//#import "DDASLLogger.h"
//#import "DDFileLogger.h"

@interface LogFileManager : DDLogFileManagerDefault

@end

LogFileManager.m

#import "LogFileManager.h"

@implementation LogFileManager

- (NSString *)newLogFileName {
    NSBundle *bundle = [NSBundle mainBundle];
    NSDictionary *info = [bundle infoDictionary];
    NSString *appName = [info objectForKey:@"CFBundleExecutable"];

    NSString *timeStamp = [self getTimestamp];

    return [NSString stringWithFormat:@"%@%@.log", appName, timeStamp];
}

- (BOOL)isLogFile:(NSString *)fileName {
    return NO;
}

- (NSString *)getTimestamp {
    static dispatch_once_t onceToken;
    static NSDateFormatter *dateFormatter;
    dispatch_once(&onceToken, ^{
        dateFormatter = [NSDateFormatter new];
        [dateFormatter setDateFormat:@"YYYY.MM.dd-HH.mm.ss"];
    });

    return [dateFormatter stringFromDate:NSDate.date];
}

@end

我是这样使用的:

DDLogFileManagerDefault *documentsFileManager = [[LogFileManager alloc] init];    
DDFileLogger *fileLogger = [[DDFileLogger alloc] initWithLogFileManager:documentsFileManager];

当我用 DDLogFileManagerDefault 替换 LogFileManager 时,它工作正常。否则我得到:

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_LogFileManager", referenced from: objc-class-ref in Logger.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我到底错过了什么? CocoaLumberjack 是通过 Carthage 3.2.0 添加的 Xcode 8。 我已经将 CocoaLumberjack.framework 添加到构建阶段,就像项目中的所有其他框架一样 /usr/local/bin/carthage copy-frameworks

好的,我解决了。该错误非常令人困惑,但与任何事情都无关。抱歉。

这是一个大项目,有很多构建目标和很多编译标志,使不同的东西抛出警告,警告变成错误。在这种情况下,我添加了标志以禁用提到的 Logger.m class 的全局标志。但是我只将那些反标记添加到一个目标而忘记将它们添加到另一个目标。这就是它没有构建的原因。

仍然很奇怪,编译器并没有简单地说:无法构建目标 A 或在文件 B 中编译错误。相反,我得到了一条丢失的体系结构消息,这完全误导了我...很抱歉给您带来麻烦。已修复。