我正在使用CocoaLumberjack logging framework 2.0.0进行不同级别的日志记录。在我的Prefix.pch中(我知道这个文件已被弃用,但它应该可以使用)我包含Cocoalumberjack并按建议设置全局日志级别here:
#ifdef DEBUG
static const DDLogLevel ddLogLevel = DDLogLevelDebug;
#else
static const DDLogLevel ddLogLevel = DDLogLevelWarn;
#endif
我对一些方法有一个DDLogVerbose
语句,默认情况下不应该记录。 问题:但是,他们 正在登录。
检查init函数中的ddLogLevel
显示00001111,等于DDLogLevelDebug
。然而,在此之后直接执行详细的日志记录语句。的(1)
预处理行DDLogVerbose(@"I AM VERBOSE")
会显示以下代码:
do {
if(DDLogLevelVerbose & DDLogFlagVerbose)
[DDLog log : __objc_yes
level : DDLogLevelVerbose
flag : DDLogFlagVerbose
context : 0
file : "....m"
function : __PRETTY_FUNCTION__
line : 59
tag : ((void *)0)
format : (@"I AM VERBOSE")];
} while(0);
表示预处理后的LogLevel是Verbose。 (2)我发现这个级别是CocoaLumberjack中的默认值,如果没有定义日志级别:
#ifndef LOG_LEVEL_DEF
#ifdef ddLogLevel
#define LOG_LEVEL_DEF ddLogLevel
#else
#define LOG_LEVEL_DEF DDLogLevelVerbose
#endif
#endif
但是:调试它显示第一个路径被执行,即LOG_LEVEL_DEF
(根据语句的级别检查以确定是否应该记录它)被分配正确的级别(Debug)。
问题:我没有发现,为什么(1)显示LogLevel Debug ,并且在预处理之后,它切换到< em>详细 (2)。这可能是包含标题的顺序问题吗?还是我错过了一些重点?
答案 0 :(得分:1)
我没有解决这个问题,所以我编写了自己的头文件用于记录:
// Create Logging Messages by calling the functions:
// * DDLogFatal(...)
// * DDLogError(...)
// * DDLogWarn(...)
// * DDLogInfo(...)
// * DDLogDebug(...)
// * DDLogTrace(...)
// * DDLogTrace()
// Only the functions that match Log Level (defined beneath) and above this level will lead to an output.
//
// NOTE: For this file to work, the option "Treat warnings as errors" must be turned off!
/*********************************
* CURRENT LOG LEVEL ***
*********************************/
#define LOG_LEVEL LOG_LEVEL_DEBUG
/* Default Log Level */
#ifndef LOG_LEVEL
#ifdef DEBUG
#define LOG_LEVEL LOG_LEVEL_DEBUG
#else
#define LOG_LEVEL LOG_LEVEL_WARN
#endif
#endif
/* List of Log Levels */
#define LOG_LEVEL_OFF 0 // 0000 0000
#define LOG_LEVEL_FATAL 1 // 0000 0001
#define LOG_LEVEL_ERROR 3 // 0000 0011
#define LOG_LEVEL_WARN 7 // 0000 0111
#define LOG_LEVEL_INFO 15 // 0000 1111
#define LOG_LEVEL_DEBUG 31 // 0001 1111
#define LOG_LEVEL_TRACE 63 // 0011 1111
#define LOG_FLAG_FATAL 1 // 0000 0001
#define LOG_FLAG_ERROR 2 // 0000 0010
#define LOG_FLAG_WARN 4 // 0000 0100
#define LOG_FLAG_INFO 8 // 0000 1000
#define LOG_FLAG_DEBUG 16 // 0001 0000
#define LOG_FLAG_TRACE 32 // 0010 0000
#if (LOG_LEVEL & LOG_FLAG_FATAL) > 0
#define DDLogFatal(...) ALog(@"FATAL", __VA_ARGS__)
#else
#define DDLogFatal(...)
#endif
#if (LOG_LEVEL & LOG_FLAG_ERROR) > 0
#define DDLogError(...) ALog(@"ERROR", __VA_ARGS__)
#else
#define DDLogError(...)
#endif
#if (LOG_LEVEL & LOG_FLAG_WARN) > 0
#define DDLogWarn(...) ALog(@"WARNING", __VA_ARGS__)
#else
#define DDLogWarn(...)
#endif
#if (LOG_LEVEL & LOG_FLAG_INFO) > 0
#define DDLogInfo(...) ALog(@"INFO", __VA_ARGS__)
#else
#define DDLogInfo(...)
#endif
#if (LOG_LEVEL & LOG_FLAG_DEBUG) > 0
#define DDLogDebug(...) ALog(@"DEBUG", __VA_ARGS__)
#else
#define DDLogDebug(...)
#endif
#if (LOG_LEVEL & LOG_FLAG_TRACE) > 0
#define DDLogTrace(...) ALog(@"TRACE", __VA_ARGS__)
#define DDLogEntry() ALog(@"TRACE", @"->")
#else
#define DDLogTrace(...)
#define DDLogEntry()
#endif
#define ALog(logLevel, fmt, ...) NSLog((@"%s [Line %d] %@: " fmt), __PRETTY_FUNCTION__, __LINE__, logLevel, ##__VA_ARGS__)
在需要记录的任何地方包含此文件。希望这有助于某人!
答案 1 :(得分:1)
所以我不确定这是否与您遇到的问题相同,但我有类似的症状,即我的日志级别被忽略。对我来说发生的事情是,可可伐木工人们在v2中让新用户更容易上手,因为根本不需要指定日志级别来使框架工作。
根据lumberjack docs,要实际使用ddLogLevel,我需要在导入CocoaLumberjack.h文件之前#define it :
使用ddLogLevel开始使用 该库现在是可选的。如果你定义它添加#define #import之前的LOG_LEVEL_DEF ddLogLevel 并将其类型更改为 DDLogLevel
在我的情况下,我在.pch文件中这样做,所以它看起来像:
// ProjectX.pch
#define LOG_LEVEL_DEF ddLogLevel // this is the crucial bit!
#import "CocoaLumberjack/CocoaLumberjack.h"
// Then the normal definitions...
#ifdef DEBUG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
static DDLogLevel ddLogLevel = DDLogLevelWarning;
#pragma clang diagnostic pop
#else
static const DDLogLevel ddLogLevel = DDLogLevelWarning;
#endif
#define LOG_LEVEL_DEF ddLogLevel
答案 2 :(得分:0)
CocoaLumberjack有4个日志级别
“ddLogLevel”确定要执行哪些日志以及要忽略哪些日志。 如果您不希望执行DDLogVerbose,请更改为较低级别,如信息。
按如下方式更改您的DEBUG宏
#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_INFO;
#else
static const int ddLogLevel = LOG_LEVEL_ERROR;
#endif
希望这能解决您的问题。