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 自定义日志级别的主要内容,如果未能解决你的问题,请参考以下文章
(20160604)开源第三方学习之CocoaLumberjack