RSLogger 1.6.5

RSLogger 1.6.5

测试已测试
Lang语言 Obj-CObjective C
许可证 自定义
发布最新发布2018年2月

Georgiy Malyukov维护。



RSLogger 1.6.5

Objective-C 简单 iOS 管理日志库。

将 RSLogger 添加到您的项目中

源代码文件

或者,您可以直接将所有库的源代码文件添加到您的项目中。

  1. 下载最新的代码版本 master.zip,或将存储库作为 git 子模块添加到您的 git 跟踪的项目中。
  2. 在 Xcode 中打开您的项目,然后拖动所有源代码文件到您的项目中(使用“产品导航视图”)。如果从项目外部提取了代码存档,请确保选择选择复制项目。
  3. 使用 #import "RSLogger.h" 将 RSLogger 库包含到您需要的地方。

快速开始

让我们想象您正在开发客户端-服务器应用程序。您想记录网络活动、缓存管理以及应用事件,例如。我们将创建必要的记录器,然后记录一些消息,然后将几个消息组刷新到物理文件。

// initialize loggers
RSLog *logNetwork = [[RSLog alloc] initWithGroup:@"network"];
RSLog *logCache = [[RSLog alloc] initWithGroup:@"cache"];

// attach them to the singleton logging hub
[[RSLogHub instance] addLog:logNetwork];
[[RSLogHub instance] addLog:logCache];

// ...

// log some messages, for example, after app's start
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    RSLOGFUNC; // log current method
    RSLOG(@"app started"); // each NSObject descendant obtains its own logger automatically
    [logNetwork log:@"network activity: %d", self.isNetworkActive];
    [logCache log:@"cache system activated."];
    // ...
}

// then flush your messages into file, for example, when your app is going to background
- (void)applicationDidEnterBackground:(UIApplication *)application {
    RSLOGFUNC;
    // what if we want to store network/cache and app's logs in different files?
    // no problem - use two different recorders:
    RSLogRecorder *recNetwork = [[RSLogRecorder alloc] initWithName:@"networkLogs"
                                                    recordingGroups:@[@"network", @"cache"]];
    // another one for your app delegate
    // logger injected by default has group name which equals to containing class name
    NSString *groupApp = NSStringFromClass([UIApplication sharedApplication].delegate.class);
    RSLogRecorder *recApp = [[RSLogRecorder alloc] initWithName:@"appLogs"
                                                recordingGroups:@[groupApp]];               
    // then flush to files
    [recNetwork flush];
    [recApp flush];
}

就这么简单!检查您的设备文档目录,以下文件将被创建

- networkLogs.log
- appLogs.log

更详细说明

1. 消息记录

所有导入 RSLogger.h 的类将自动获得自己的记录器。您可以通过以下属性在任意时刻访问该记录器

@property (readonly, nonatomic) RSLog *logger;

您可以使用这个 RSLog 类实例来记录您的消息。同时,为了方便起见,还有 RSLOGRSLOGT 宏(下面描述)。

默认情况下,此记录器的名称将与类名相同。您可以通过以下方式在类中重写属性来更改它

- (NSString *)loggerGroupName {
    return @"MyCustomLoggerGroup";
}

2. 记录记录消息

所有记录器仅在您的应用程序存活期间存在,因为它们存储在设备的运行内存中。如果要在物理文件中存储您的日志,可以使用名为 RSLogRecorder 的类。

该类可以记录特定的记录组并将它们存储在物理文件中。可以通过多个初始化器在任何需要的时刻实例化 RSLogRecorder 对象

- (instancetype)initWithName:(NSString *)name
             recordingGroups:(NSArray<NSString *> *)loggerGroups;
- (instancetype)initWithName:(NSString *)name
             recordingGroups:(NSArray<NSString *> *)loggerGroups
                    filePath:(NSString * _Nullable)path;
- (instancetype)initWithName:(NSString *)name
             recordingGroups:(NSArray<NSString *> *)loggerGroups
                   uploadURL:(NSString * _Nullable)url;

差异仅在于指定目标物理文件的路径。如果您不指定,则将使用默认文件路径

/<DOCUMENTS_DIR>/<RSLogRecorder_Instance_Name>.log

在实例化 RSLogRecorder 后,您可以使用单个方法覆盖目标文件并存储所有消息

- (void)flush;

此方法在独立线程中执行,因此您无需担心性能问题。

3. 输出消息分析

您还可以直接访问 RSLogHub 单例以获取您应用程序中所有对象的全部日志消息,或者仅通过使用一些属性和方法如这些仅获取具有特定组名的日志记录器

// contains all logged messages from all loggers inside your app
@property (readonly, nonatomic) NSArray<RSLogMessage *> *allMessages;

// returns only loggers with specified group names
- (NSArray<RSLog *> *)loggersWithGroups:(NSArray<NSString *> *)groups;

请参阅文档齐全的头文件和示例项目以获取详细信息。

4. 记录器配置

所有 RSLog 类实例均具有特定属性 configuration,其类型为 RSLogConfiguration。它包含该具体记录器使用的入站消息配置。此属性通常设置为 nil,并使用在 RSLogHub 类中声明的 defaultConfiguration 属性。默认规则如下:

  1. 启用记录。所有新的入站消息将存储在内存中。
  2. 入站消息将在异步队列中以系统控制台显示。

如果您想在某一时刻对所有记录器使用另一个配置,只需重置 RSLogHub 类实例中的 defaultConfiguration 属性。此外,您还可以通过重置其自身的 configuration 属性为新记录设置来配置任何具体记录器。

请注意,如果您为具体的 RSLog 类实例重置 configuration 属性,则它将不会受 RSLogHub 全局配置的影响,即使您在其中禁用记录也是如此。如果您想从具体记录器中删除配置以使用 defaultConfiguration 代替,只需将此记录器的 configuration 属性设置为 nil

5. 上传日志

您可以通过设置 uploadURL 属性并调用 upload 方法将日志作为 text/plain 值上传到 HTTP 请求体中。在这种情况下,您的服务器必须支持在 HTTP 体内接收纯文本。

详细使用方法

RSLogHub 类

您的应用程序中注册的所有记录器的集中式管理器。方便的访问点,以获取有关您应用程序中所有对象的特定记录器中部分或全部日志消息的信息。您可以获取所有消息或当前应用程序使用所有记录器,您还可以访问仅具有特定组的记录器或消息以过滤输出结果。有关详细信息,请参阅 RSLogHub 头文件。

RSLog 类

RSLogger 库包含封装所有记录方法的主体类,名为 RSLog。它完全使用 Apple HeaderDoc 注释进行文档编制,非常易于使用。

首先请注意,有 RSLog 类别为基本 NSObject 类(自动导入 RSLogger.h 头文件)。导入 RSLogger 库后,所有类都将获得一个只读公共属性,声明如下

@property (readonly, nonatomic) RSLog *logger;

此属性将在第一次调用后实例化。 RSLog 类实例将具有一个与其注入的日志器对应的 名称,该名称等于您自己的类名。

此外,此类别包含两个用于方便记录不带格式化参数的纯文本消息的宏。

RSLOGT(target, message, ...) // logs your message into target's logger
RSLOGF(message, ...) // logs your message into self logger with arguments
RSLOG(message) // calls RSLOGF macro with nil arguments
RSLOGFUNC // logs current function

当然,您还可以创建并实例化自己的 RSLog 类实例,除内部对象日志器外。

下面是RSLog类的两个初始化程序,如下所示

- (instancetype)init; // empty group name
- (instancetype)initWithGroup:(NSString * _Nullable)group;

所有日志器都可以有自己的 逻辑组。例如,如果您想为您的网络、存储、数据库管理类等创建不同的日志器,则可以为每个这些模块单独实例化日志器,并使用可读性高的组名称。

默认日志方法可以接收可变格式参数列表

- (void)log:(NSString *)format, ...; // logs a message into logger

使用示例

RSLOGT(myObject, @"Object updated.", nil); // equals to [myObject.logger log:@"Object updated."]
RSLOG(@"Models processed."); // equals to [self.logger log:@"Models processed."]

NSString *host = "127.0.0.1";
RSLog *netLogger = [[RSLog alloc] initWithGroup:@"network"];
[netLogger log:@"Connected to host: %@", host];

输出结果将如下所示

[MyObjectClass] Object updated.
[MyRootClass] Models processed.
[network] Connected to host: 127.0.0.1

请注意,如果日志器的配置中 isLoggingEnabled 标志设置为 NO,则这些方法将不会做任何事。

所有记录的消息都可以通过 RSLog 内部的两个公共属性访问

@property (readonly, nonatomic) NSArray<RXLogMessage *> *messages;
@property (readonly, nonatomic) NSString *messagesString;

请注意,messagesString 属性将返回性能消息,通过换行符 \n 连接。

合并日志器

让我们假设在某个事件发生后,您想将这些日志器合并为一个新日志器。可以通过调用此方法来完成

+ (RSLog *)loggerByJoining:(NSArray<RSLog *> *)loggers group:(NSString * _Nullable)group;

此方法将实例化一个新的带有可选 group 值的 RSLog 类实例,来自带有第一个参数的日志器的所有消息将合并到一个新的实例中。例如(使用上面代码)

RSLog *commonLogger = [RSLog loggerByJoining:@[myObject.logger, self.logger, netLogger] group:@"common"];
[commonLogger log:@"New message 1"];
[commonLogger log:@"New message 2"];

所有传入日志器的消息将按日期自动按升序排序。来自 commonLogger 的输出日志将如下所示

[MyObjectClass] Object updated.
[MyRootClass] Models processed.
[network] Connected to host: 127.0.0.1
[common] New message 1
[common] New message 2

您也可以通过调用此方法在日志器内直接注入任何其他记录消息列表

- (void)injectMessages:(NSArray<RSLogMessage *> *)messages;

这些消息也将自动与日志器消息合并,并按日期的升序排序。

RSLogMessage 类

此类代表单个记录消息信息,如 messageUID(有唯一消息 ID)、此消息的 date(创建日期)、消息的 text 和可选的 group 名称,以便进行更深入的逻辑分组(例如,每个日志器可以有同时的 "error","warning""notification" 消息)。

每个消息都可以通过调用 NSObject 的 description 属性来在系统控制台显示或发送到任何其他输出流。消息的日期将自动显示,包括毫秒和时区。

RSLogConfiguration 类

此类代表可以分配给任何具体日志器或“全局”RSLogHub defaultConfiguration 属性的记录配置。配置类实例是不变的。您可以使用初始化器配置属性。属性如下

  1. isLoggingEnabled。指示此配置是否允许记录任何消息。如果设置为 NO,则在使用此配置时将不会保存任何传入的消息。
  2. printMode。决定如何调用标准 NSLog()。每个记录的消息都可以异步显示在系统控制台(默认)或同步显示,您也可以完全禁用打印。

在大多数情况下,您可能不需要使用自己的配置,但如果需要,请记住几个要点

  1. RSLogHub类实例包含defaultConfiguration属性。您可以使用自己的配置来重置它。此配置默认应用于应用程序中所有没有设置自己配置的日志记录器。
  2. 每个RSLog类实例都可以使用自己的configuration属性进行配置。默认情况下,它设置为nil,并且使用全局的defaultConfiguration。您可以使用自定义的RSLogConfiguration类实例来设置它,或者再次将其设置为nil以将设置重置为默认值。
  3. 全局的defaultConfiguration不会影响已经用自己配置配置好的日志记录器。

许可证

Apache。详细信息请参阅LICENSE文件。