zoukankan      html  css  js  c++  java
  • iOS-创建自己的日志系统

    今天说说怎么创建自己的日志系统

    先看下Xcode自己的日志(这里说的NSLog)

    系统自带的NSLog打印的信息只有简单的 时间 / 项目名称 / 打印内容

    内容比较简单, 很难做分类管理和写入文件 或者上传等等.

    今天我们借用CocoaLumberjack 来自定义自己的日志系统, 最终实现的效果为:

    #1. Log信息分类

    #2. 时间

    #3. 产生log的类

    #4. 产生log所在方法名

    #5. 代码所在行

    #6. log写入文件

    最后并实现log上传给后台服务器

    好了, 下面来说说怎么实现的

    首先我们先看下CocoaLumberjack的基本用法

    Pod导入

    pod 'CocoaLumberjack'
    

     新建pch文件, 并添加:

    #import <CocoaLumberjack/CocoaLumberjack.h>
    static const DDLogLevel ddLogLevel = DDLogLevelDebug;
    

     ddLogLevel可依照需要设置为:

     DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo / DDLogDebug / DDLogLevelOff

     如果设置为Debug级别, 则 DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo / DDLogLevelDebug都能产生日志

    Info级别, 则DDLogLevelError / DDLogLevelWarning / DDLogLevelInfo都能产生日志, DDlogLevelDebug不能产生日志 也不能显示在xcode console

    往前依次类推, 

    DDLogLevelOff级别是都不显示也不产生日志

    做完以上两个步骤就完成的前面的配置工作了

    然后参照官方的代码就可以直接用了:

    [DDLog addLogger:[DDTTYLogger sharedInstance]]; // TTY = Xcode console
    [DDLog addLogger:[DDASLLogger sharedInstance]]; // ASL = Apple System Logs
    
    DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; // File Logger
    fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
    fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
    [DDLog addLogger:fileLogger];
    
    ...
    
    DDLogVerbose(@"Verbose");
    DDLogDebug(@"Debug");
    DDLogInfo(@"Info");
    DDLogWarn(@"Warn");
    DDLogError(@"Error");
    

     但这样只能打印基本的只有Verbose / Debug等内容的信息

    这里我们需要定义自己的样式, 就是要自己定义DDFileLogger的logFileManager

    直接上代码吧:

    #import <Foundation/Foundation.h>
    
    @interface MyCustomFormatter : NSObject <DDLogFormatter> {
        
        int loggerCount;
        NSDateFormatter *threadUnsafeDateFormatter;
    }
    
    @end
    
    #import "MyCustomFormatter.h"
    
    @implementation MyCustomFormatter
    
    - (id)init {
        
        if((self = [super init])) {
            
            threadUnsafeDateFormatter = [[NSDateFormatter alloc] init];
            [threadUnsafeDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
        }
        
        return self;
    }
    
    - (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
        
        NSString *logLevel;
        switch (logMessage->_flag) {
            case DDLogFlagError    : logLevel = @"Error   "; break;
            case DDLogFlagWarning  : logLevel = @"Warning "; break;
            case DDLogFlagInfo     : logLevel = @"Info    "; break;
            case DDLogFlagDebug    : logLevel = @"Debug   "; break;
            default                : logLevel = @"Default "; break;
        }
        
        NSString *dateAndTime = [threadUnsafeDateFormatter stringFromDate:(logMessage->_timestamp)];
        NSString *logMsg = logMessage->_message;
        
        return [NSString stringWithFormat:@"[ %@ %@ ] 
    %@", logLevel, dateAndTime, logMsg];
    }
    
    - (void)didAddToLogger:(id <DDLogger>)logger {
        
        loggerCount++;
        NSAssert(loggerCount <= 1, @"This logger isn't thread-safe");
    }
    
    - (void)willRemoveFromLogger:(id <DDLogger>)logger {
        
        loggerCount--;
    }
    
    @end
    

     然后按照以下方法配置CocoaLumberjack

    //配置CocoaLumberjack
        [DDLog addLogger:[DDASLLogger sharedInstance]]; //add log to Apple System Logs
        [DDLog addLogger:[DDTTYLogger sharedInstance]]; //add log to Xcode console
        
        [DDTTYLogger sharedInstance].logFormatter = [[MyCustomFormatter alloc] init];
        
        //自定义logfile path
        DDLogFileManagerDefault *logFileManager = 
        [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
        
        DDFileLogger *customFileLogger = [[DDFileLogger alloc] initWithLogFileManager:logFileManager];
        
        customFileLogger.rollingFrequency                       = 60 * 60 * 24;
        customFileLogger.logFileManager.maximumNumberOfLogFiles = 7;
    
    
        [DDLog addLogger:customFileLogger];
    

     不过这样只是完成了自定义自己要的日志格式并自定义路径

    还不能上线上传, 如果要上传有两种方式:

    1>直接获取log文件地址, 上传

    2>创建一个管理类, 来统一管理日志的关闭和启用

    获取日志文件地址的方法: 

    customFileLogger.currentLogFileInfo.filePath;

    推荐第二个

    附上一个我封装好的Demo, 供大家参考.

    https://github.com/zhouxihi/NVLogManager

    欢迎大神们指出不足, 跪拜.  

    也希望大家能不吝star

  • 相关阅读:
    调用Type.InvokeMember()时出现MissingMethodException
    C#学习之Delegate
    WCF之元数据交换 (Metadata Exchange)
    定义Enum的开始和结束,这样就能循环Enum了
    定制自己的Visual Studio的Debugger Visualizer
    C#中 #if DEBUG 和 Conditional("DEBUG")的区别
    从哪里开始学习Windows 8?(zz)
    Macro 小总结
    WPF应用的图标
    如何把 Visutal studio中的“printonbreakpoint”消息打印在程序的任何地方
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/6940285.html
Copyright © 2011-2022 走看看