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:@"[ %@ %@ ] \n%@", 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
iOS-创建自己的日志系统的更多相关文章
- 精尽Spring Boot源码分析 - 日志系统
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- iOS 日志系统 本地日志打包上传到服务器
日志系统主要包含两个部分 1.本地保存 我们知道NSLog打印的日志一般都是直接输出到控制台,开发人员可以在控制台直接看到实时打印的log,既然可以在控制台输出,那么能否将日志输出到其他地方呢,比如说 ...
- WCF 项目应用连载[2] - 创建Lig日志系统
WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 现在我们创建一个Lig工程 - Litelog 2.1 创建Lig服务 _________________ ...
- Java 为程序创建日志系统
使用JAVA创建日志系统有两种方法 1.使用log4j操作日志文件 2.使用系统重定向输出日志信息 方法1:使用log4j操作日志文件(可使用jar或者xml) 步骤1:下载log4j.jar 下载地 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...
- iOS开源项目之日志框架CocoaLumberjack
CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.CocoaLumberjack类似于流行的日志框架(如log4j),但它是专为Objective-C设计的 ...
- Atitit.日志系统slf4j的使用
Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...
- 日志系统实战(三)-分布式跟踪的Net实现
介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了.莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是Ios端参数传的不对?还是A系统或B系统提供的接口导致?相信有不少人遇 ...
- 日志系统实战(一)—AOP静态注入
背景 近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息,这时就想到用Aop注入的方式. AOP分动态注入和静态注入两种注入的方式. 动态注入方式 利用Remoting的Context ...
随机推荐
- 线段树(hdu 2795)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- YARN学习总结
YARN学习总结 前言 YARN(Yet Another Resource Manage,另一种资源协调者)是hadoop-0.23版本引入的的一个新的特性,可以说它是对原有Hadoop Mapred ...
- 1001. Exponentiation高精度运算总结
解题思路 这道题属于高精度乘法运算,要求输入一个实数R一个指数N,求实数R的N次方,由于R有5个数位,而N又特别大,因此用C++自带的数据类型放不下. 解题思路是通过数组储存每次乘积结果和底数的每一位 ...
- Linux-进程描述(2)之进程标识符与进程位置
在上一篇文章中详细介绍了task_struct结构体内的常见成员,然后我们就来看一下具体内容.每个进程都把它的信息放在 task_struct 这个数据结构中,task_struct 包含了这些内容: ...
- php 启动过程 - reqeust RINIT 过程
php 启动过程 - reqeust RINIT 过程 概述 apache 接收到请求之后, 交给 php 处理 php 模块在接收到请求后, 会对请求进行初始化, 及 RINIT 过程 调用触发 a ...
- 腾讯AlloyTeam正式发布Canvas魔幻线条 - curvejs
[原文链接] ## 写在前面 curvejs 中文读["克js"],是腾讯AlloyTeam打造的一款魔幻线条框架,让线条成为一名优秀的舞者,让线条们成为优秀的舞团,HTML5 ...
- 启动LUXContentTests过程中遇到的问题
首先,要想在localbox中使用Selenium,就得准备好浏览器的driver文件.比如chrome对应的chromedriver文件,该文件是一个exe可执行文件. 问题:当我尝试去跑LUXCo ...
- bootstrap快速入门笔记(二)-栅格系统,响应式类
一,栅格系统大致有以下: 1,行row必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,一行有12列 2.“列(column)”在水平方向创建一 ...
- 安装node-saas包报错问题
项目中用到一些sass写的样式,但是每次一编译就报错 按照它上面的提醒,npm rebuild node-sass --force,还是一样有错.不过仔细看看他的错误信息我发现了其中这条: gyp v ...
- mysql行列转换方法总结
这是一道行转列并且构造交叉表的问题: http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html 数据样 ...