阅读版权
本文档将(希望)很快进行彻底的重设计和重写。在此之前,请使用论坛或给我发电子邮件。
注意:我已移除 L4LogManager;我这样做是因为所有代码只是类方法,并且最初是从 L4Logger 中调用(只是转发)。我还移除了 L4Logger 中的 '简单' 记录方法,这些方法作为方便方法存在,如果用户不希望使用宏,则可以使用。因此,现在您需要使用宏。如果您认为这是问题,请告诉我。移除这些代码的原因是,我正在尽量减少代码(不是功能)。一旦设置了适当的测试,也许我会考虑重建一些(如果有要求这么做的话)。
下面是使用方法。
要使用此框架进行记录,在您应用程序的主方法中执行以下操作
// initialize the logging system. [[L4Logger rootLogger] setLevel:[L4Level all]]; [[L4Logger rootLogger] addAppender: [[L4ConsoleAppender alloc] initTarget:YES withLayout: [L4Layout simpleLayout]]]; L4Logger *theLogger = [L4Logger loggerForClass:[L4FunctionLogger class]]; [theLogger setLevel:[L4Level info]]; log4CDebug(@"The logging system has been initialized.");
别忘了
导入 "
以上代码做了以下操作
为了使 Log4Cocoa 更易于使用,有一些高级宏,如下所示(目前没有对异常进行处理;需要一个布局类来处理它)
对于类
log4Debug(message); log4Info(message); log4Warn(message); log4Error(message); log4Fatal(message); log4DebugWithException(message, e); log4InfoWithException(message, e); log4WarnWithException(message, e); log4ErrorWithException(message, e); log4FatalWithException(message, e); log4Assert(assertion, message);
对于函数
log4CDebug(message); log4CInfo(message); log4CWarn(message); log4CError(message); log4CFatal(message); log4CDebugWithException(message, e); log4CInfoWithException(message, e); log4CWarnWithException(message, e); log4CErrorWithException(message, e); log4CFatalWithException(message, e); log4CAssert(assertion, message);
注意:当使用 xxxWithException 宏时,异常放在消息的任何参数之前。这是由于宏展开方式和可变长度参数工作方式的原因。之前,您需要在消息及其参数周围加括号,然后跟上异常。现在不要这样做。
从 IBAction 记录消息(作为一个简单的使用示例)
- (IBAction)logit:(id) sender { log4Debug(@"Hello %@", [sender description]); }
与异常记录消息
- (void) someMethod { NSException *exception = [NSException exceptionWithName:@"Foo" reason:@"Bar" userInfo:nil]; log4DebugWithException(@"Hello %@", exception, @"world!"); }
用于函数的宏的下面有 'C';这似乎与苹果所做的保持一致(例如,断言)。
Debug 和 Info 宏的两种版本都展开为被 isEnabled
if 语句包裹的方法。
所有其他级别都会展开到它们的对应项,但不会被isEnabled
条件语句所包含。
函数log4Assert()
和log4CAssert()
都接受一个BOOL
类型的断言表达式,该表达式必须评估为YES
,否则它将把消息记录为一个错误。
注意:这些宏中都没有包含最后的分号,所以在调用它们时请确保使用一个。
两个核心的日志便利方法被实现为NSObject
上的类别(如果您想从一个NSProxy
中记录日志,您需要在这些地方实现它们……也许我们会提供这些便利方法,但是我们还没有做)。由于这些是NSObject
上的类别,我们添加了'l4'前缀来更加谨慎,以避免与他人的类别发生名称冲突。
@interface NSObject (L4CocoaMethods) + (L4Logger *) l4Logger; - (L4Logger *) l4Logger; @end
因此,[self l4Logger]
将返回一个基于调用类对象的L4Logger实例。要记录一条消息,不使用上面的宏,使用方法如下:
[[self l4Logger] l4fatal: @"Crap something fatal happened. You're screwed. Game Over."]; [[self l4Logger] l4debug: @"Debug info goes here. La de da. All the King's horses & all the kings men couldn't put Humpty Dumpty back together again."];
坦白说,我不知道为什么您不想使用这些宏,但非宏版本仍然存在,以防这是您想要的,或者由于某些原因您无法使用宏版本。
由于+logger; 和 -logger; 以NSObject上的类别实现,因此如果您不想使用类默认的日志记录器或者想要缓存日志记录器,您可以覆盖它们。
对于设置方法的日志记录级别,有一个便利类L4FunctionLogger提供支持;然而,请注意,这里对日志级别的任何更改都将影响所有方法的日志记录。
要实际上在您的应用程序中集成Log4Cocoa,您需要向构建目标添加一个复制阶段。只要Log4Cocoa安装在您的框架搜索路径中,您的应用程序就会运行,但集成它将使部署变得更加容易,并且当您使用一个未实际集成的框架时,gdb会受到干扰。
根据Apple的文档
将框架复制到应用程序中
在应用程序的目标中,您需要添加一个复制文件的构建阶段以将框架复制到应用程序中。
将框架添加到应用程序的目标中。参见“添加文件和框架”。如果应用程序的目标和框架的目标在同一个项目中,您还应该使应用程序的目标依赖于框架的目标。参见“管理目标依赖”。
在项目窗口中,单击“目标”选项卡,并打开应用程序目标。
单击“构建阶段”下的最后一个构建阶段,然后选择项目 > 新建构建阶段 > 新建复制文件构建阶段。
从“位置”弹出菜单中选择框架,选择“安装时才复制”选项,并将框架拖到“文件”字段中。
您可以在项目的文件列表中“产品”组中找到这个框架。