CocoaLumberjack 自定义日志级别

Posted

技术标签:

【中文标题】CocoaLumberjack 自定义日志级别【英文标题】:CocoaLumberjack Custom Log Levels 【发布时间】:2014-01-23 01:15:51 【问题描述】:

我已经开始使用 CocoaLumberjack,并且对使用他们的自定义日志级别功能很感兴趣。他们在https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/CustomLogLevels 提供了一个方便的配置来帮助您入门。我不知道我现在到底想要什么,所以我就这样留下了。

接下来我使用这个在我的代码中设置我的调试级别...

static const int ddLogLevel = LOG_LEVEL_DEBUG;

但是,使用此设置时,只会显示比 LOG_LEVEL_DEBUG 更严重的消息。这意味着对 DDLogInfo() 及以上的调用会显示,但不会显示 DDLogDebug()。当我向上滑动时也是如此。所以...

static const int ddLogLevel = LOG_LEVEL_INFO;

...忽略 DDLogInfo() 和 DDLogDebug(),但显示 DDLogNotice() 和更高版本。当然,预期的行为将包含该警告级别。

这是 CocoaLumberjack 内部做出决定的代码...

for (DDLoggerNode *loggerNode in loggers) 
    // skip the loggers that shouldn't write this message based on the logLevel

    if (!(logMessage->logFlag & loggerNode.logLevel)) 
        continue;
    

    dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^ @autoreleasepool 

        [loggerNode->logger logMessage:logMessage];

    );

在我的第一个示例中,我的日志级别是 111111 (63),消息标志(使用 DDLogDebug())是 100000 (32)。 63 & 32 是 YES,所以这会失败(使用 NOT)。所以我认为该消息会被记录下来。将日志方法向上移动到 DDLogInfo(),它的消息标志为 010000 (16)。这仍然是 YES 并且因此以 NOT 失败,所以我们被记录了。但我在这种情况下看到了。有人有这方面的经验吗?

【问题讨论】:

我刚刚在我自己的项目中使用 Lumberjack 对此进行了测试,我可以确认它可以按照您预期的方式工作。如果我将级别设置为例如LOG_LEVEL_WARN,然后我看到所有警告及以上。如果我将其设置为LOG_LEVEL_INFO,我会看到所有信息及以上信息。您是否添加了任何额外的代码来自己自定义/更改日志级别? @JamesFrost,唯一的修改是使用 CL 的“MYLog.h”,该链接可在上面的链接中找到。我切换回他们的正常处理,它确实工作正常。他们如何为“自定义”关卡创建位掩码一定是个问题。 【参考方案1】:

我想我已经解决了。在 CocoaLumberjack 本身中,在 DDLog.h 中,日志级别标志的定义如下:

#define LOG_FLAG_ERROR    (1 << 0)  // 0...00001
#define LOG_FLAG_WARN     (1 << 1)  // 0...00010
#define LOG_FLAG_INFO     (1 << 2)  // 0...00100
#define LOG_FLAG_DEBUG    (1 << 3)  // 0...01000
#define LOG_FLAG_VERBOSE  (1 << 4)  // 0...10000

但是,CustomLogLevels MyLog.h 文件将它们定义为:

#define LOG_FLAG_FATAL   (1 << 0)  // 0...000001
#define LOG_FLAG_ERROR   (1 << 1)  // 0...000010
#define LOG_FLAG_WARN    (1 << 2)  // 0...000100
#define LOG_FLAG_NOTICE  (1 << 3)  // 0...001000
#define LOG_FLAG_INFO    (1 << 4)  // 0...010000
#define LOG_FLAG_DEBUG   (1 << 5)  // 0...100000

请注意,它添加了一个额外的FATAL 标志,其效果是将所有其他标志向下移动一个位置。这就是您所看到的问题的原因。

【讨论】:

嗨,詹姆斯,在 MyLog.h 中,一切都首先得到#undef'd,所以我不认为就是这样。我认为这实际上与 MyLog.h 构建每个级别的方式有关。他们用当前的 FLAG 或之前的 LEVEL 并为每个 FLAG 继续这样做。在 DDLog.h 中,它们将每个级别的每个 FLAG 组合在一起。虽然手动执行此操作没有任何区别,但这是两种方法之间唯一不同的地方。我可以通过将 MyLog.h 更改为相同的技术来确认这一点,但我已经继续前进了。 :/ 感谢您的帮助! 是的,他们#undef 现有的日志级别定义,然后(如我上面的回答)他们重新定义它们 - 但是通过添加LOG_FLAG_FATAL,他们将所有其他标志向下移动一处。 DDLogDebug 等也被重新定义。我想如果重新定义 LOG_FLAG_DEBUG 并将 DDLogDebug 设置为查找该值,然后我的应用程序将其日志级别设置为 LOG_LEVEL_DEBUG,那么它将全部匹配。我想我没有关注。【参考方案2】:

如果您的自定义级别高于内置级别,请尝试使用以下命令进行初始化:

[DDLog addLogger: [DDASLLogger sharedInstance] withLogLevel: LOG_LEVEL_CUSTOM];
[DDLog addLogger: [DDTTYLogger sharedInstance] withLogLevel: LOG_LEVEL_CUSTOM];

其中 LOG_LEVEL_CUSTOM 在您的 MyLog.h 中定义为:

#define LOG_LEVEL_CUSTOM (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_CUSTOM)

【讨论】:

以上是关于CocoaLumberjack 自定义日志级别的主要内容,如果未能解决你的问题,请参考以下文章

CocoaLumberjack日志框架的简单归纳

(20160604)开源第三方学习之CocoaLumberjack

自定义log4j日志级别

Log4j 自定义配置为每个级别分隔日志 - Playframework 1.2.5

Spring Boot-日志配置(超详细)

python自定义日志函数测试