Log4Cocoa 0.1.0

Log4Cocoa 0.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布最后发布2014年12月

未声明 维护。



Log4Cocoa 0.1.0

  • StuFF mc, Endika Gutiérrez Salas, Timothy Reaves, Bob Frank 和 Michael James

Log4Cocoa 使用方法(2011年5月4日)

阅读版权

本文档将(希望)很快进行彻底的重设计和重写。在此之前,请使用论坛或给我发电子邮件。

注意:我已移除 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.");

别忘了

导入 ""

以上代码做了以下操作

  • 将系统级别的记录级别设置为所有(所有内容都得到记录)(这也初始化了记录系统)。
  • 将默认的附加器设置为控制台附加器,使用简单的布局。要查看日志输出,您需要打开控制台可见(不是 Console.app,而是 stdout)。
  • 获取方法的记录实例
  • 将级别设置为 info,以便从所有方法进行所有记录(因此调试内容不会显示)。
  • 记录字符串 "记录系统已初始化。"

为了使 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提供支持;然而,请注意,这里对日志级别的任何更改都将影响所有方法的日志记录。

II. 集成Log4Cocoa

要实际上在您的应用程序中集成Log4Cocoa,您需要向构建目标添加一个复制阶段。只要Log4Cocoa安装在您的框架搜索路径中,您的应用程序就会运行,但集成它将使部署变得更加容易,并且当您使用一个未实际集成的框架时,gdb会受到干扰。

根据Apple的文档

https://developer.apple.com/techpubs/macosx/DeveloperTools/ProjectBuilder/ProjectBuilder.help/Contents/Resources/English.lproj/Frameworks/chapter_19_section_3.html

将框架复制到应用程序中

在应用程序的目标中,您需要添加一个复制文件的构建阶段以将框架复制到应用程序中。

  1. 将框架添加到应用程序的目标中。参见“添加文件和框架”。如果应用程序的目标和框架的目标在同一个项目中,您还应该使应用程序的目标依赖于框架的目标。参见“管理目标依赖”。

  2. 在项目窗口中,单击“目标”选项卡,并打开应用程序目标。

  3. 单击“构建阶段”下的最后一个构建阶段,然后选择项目 > 新建构建阶段 > 新建复制文件构建阶段。

  4. 从“位置”弹出菜单中选择框架,选择“安装时才复制”选项,并将框架拖到“文件”字段中。

您可以在项目的文件列表中“产品”组中找到这个框架。