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 ...
随机推荐
- 用react开发一个新闻列表网站(PC和移动端)
最近在学习react,试着做了一个新闻类的网站,结合ant design框架, 并且可以同时在PC和移动端运行: 主要包含登录和注册组件.头部和脚部组件.新闻块类组件.详情页组件.评论和收藏组件等: ...
- Android 代码库(自定义一套 Dialog通用提示框 )
做Android开发五年了,期间做做停停(去做后台开发,服务器管理),当回来做Android的时候,发现很生疏,好些控件以前写得很顺手,现在好像忘记些什么了,总要打开这个项目,打开那个项目 ...
- 记录一个NPE问题
昨天在做公司项目时,我在一处地方加了一个逻辑校验,之后测了下发现在方法调用深处有一处NPE,来源于另一个同事的代码. 其实NPE本应该是个Java编程中老掉牙的问题,但我觉得这一处错误还是比较典型的, ...
- Linq 查询与普通查询的区别
普通:select * --1 from User(表名) as u --2 where u.Name like '%s%' --3 Linq : from User(表名) as u --1 whe ...
- hdu1281二分图匹配
小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的"车",并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放, ...
- openlayers应用“四”:百度地图纠偏续
续前一篇,上一篇提到百度地图纠偏的基本思路,经过经过一天的努力,实现了百度地图坐标偏移参数的提取,步骤以及实现效果如下: 1.数据来源:四川省的省道矢量数据 2.提取坐标偏移参数的过程如下: A.将四 ...
- O(mn)实现LCIS
序: LCIS即求两序列的最长公共不下降子序列.思路于LCS基本一致. 用dp[i][j]记录当前最大值. 代码实现: /* About: LCIS O(mn) Auther: kongse_qi D ...
- ASP.NET MVC, Url长度过长问题解决,404.15问题
最近在处理一个问题的时候,发现他们存在一个大量数据放在URL中传递的过程,当数据达到一定数量的时候就会报出404.15问题. 运行环境是在IIS8,经过查询之后发现,URL此时最大长度为2048,肯定 ...
- hdu2159 FATE 经典二维背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路: 定义ans存当前满足条件的消耗的最小的忍耐值(满足条件的忍耐值为在当前消耗的忍耐值的情况 ...
- 取消关联svn
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] @= ...