swift学习日志—— Log日志
Log 输出是程序开发中很重要的组成部分,虽然它并不是直接的业务代码,但是却可以忠实地反映我们的程序是如何工作的,以及记录程序运行的过程中发生了什么。在OC中的Log日志设置请看我的另一篇博客:设置Log日志打印开关
在 Swift 中,最简单的输出方法就是使用 print
,在我们关心的地方输出字符串和值。但是这并不够,试想一下当程序变得非常复杂的时候,我们可能会输出很多内容,而想在其中寻找到我们希望的输出其实并不容易。我们往往需要更好更精确的输出,这包括输出这个 log 的文件,调用的行号以及所处的方法名字等等。
我们当然可以在 print
的时候将当前的文件名字和那些必要的信息作为参数同我们的消息一起进行打印:
// Test.swift
func method() { //...print("文件名:Test.swift, 方法名:method,这是一条输出")//...
}
但是这显然非常麻烦,每次输入文件名和方法名不说,随着代码的改变,这些 Log 的位置也可能发生改变,这时我们可能还需要不断地去维护这些输出,代价实在太大。
在 Swift 中,编译器为我们准备了几个很有用的编译符号,用来处理类似这样的需求,它们分别是:
符号 | 类型 | 描述 |
---|---|---|
FILE | String | 包含这个符号的文件的路径 |
LINE | Int | 符号出现处的行号 |
COLUMN | Int | 符号出现处的列 |
FUNCTION | String | 包含这个符号的方法名字 |
因此,我们可以通过使用这些符号来写一个好一些的 Log 输出方法:
func printLog<T>(message: T, file: String = __FILE__,method: String = __FUNCTION__,line: Int = __LINE__)
{print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}
这样,在进行 log 的时候我们只需要使用这个方法就能完成文件名,行号以及方法名的输出了。最棒的是,我们不再需要对这样的输出进行维护,无论在哪里它都能正确地输出各个参数:
// Test.swift
func method() { //...printLog("这是一条输出")//...
}// 输出:
// Test.swift[62], method(): 这是一条输出
另外,对于 log 输出更多地其实是用在程序开发和调试的过程中的,过多的输出有可能对运行的性能造成影响。在 Release 版本中关闭掉向控制台的输出也是软件开发中一种常见的做法。如果我们在开发中就注意使用了统一的 log 输出的话,这就变得非常简单了。使用条件编译的方法,我们可以添加条件,并设置合适的编译配置,使 printLog
的内容在 Release 时被去掉,从而成为一个空方法:
func printLog<T>(message: T, file: String = __FILE__,method: String = __FUNCTION__,line: Int = __LINE__)
{#if DEBUGprint("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")#endif
}
新版本的 LLVM 编译器在遇到这个空方法时,甚至会直接将这个方法整个去掉,完全不去调用它,从而实现零成本
swift学习日志—— Log日志相关推荐
- 西安天讯:怎样添加百度蜘蛛访问网站日志log日志
时间 s-sitename W3SVC1 \: date 2010-07-30 \:06:43 \\\\.;\\\\\服务器名称 s-computername MGL \\ 网站名称 s-ip .日志 ...
- ROS学习笔记-log日志以及输出工具(rqt_console)
1. log文件的位置 log文件夹下的文件夹是运行launch文件产生的 位于: log file: /home/.ros/log/- 如果在home目录下直接搜索log没有查到的话,说明被隐藏了, ...
- linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...
前言 有一段log日志,需从日志里面分析,统计IP访问次数排序前10名,查看是否有异常攻击. 日志提取 如下日志,这段日志包含的信息内容较多,我们希望提取ip,访问时间,请求方式,访问路径(不带参数) ...
- Log 日志的使用与重要性
开发过程中出现bug是必不可免的,你会怎样debug?从第1行代码开始看么?还是有个文件里面记录着哪里错了更方便呢!!!log日志 Python中有个logging模块可以完成相关信息的记录,在deb ...
- 用tensorboard可视化log日志
最近在学习处理三维点云的神经网络模型PointNet,在数据训练完成后,要对日志进行图表可视化,因此用到了tensorflow自带的具有强大功能的可视化工具tensorboard.为避免遗忘,特此记录 ...
- 自动化测试如何生成log日志
大家好,最近在学习自动化测试如何去打印log日志,首先我要知道为什么要去打印log日志? 答:使用通俗易懂的话表达就是因为在测试的过程中,如果某条测试用例没有执行通过,出现了bug,有了日志的记录就可 ...
- Linux学习-66-系统日志管理
15 Linux系统日志管理 系统日志详细地记录了在什么时间,哪台服务器.哪个程序或服务出现了什么情况.不管是哪种操作系统,都详细地记录了重要程序和服务的日志,只是我们很少养成查看日志的习惯. 日志是 ...
- 全栈必备 Log日志
Log日志,不论对开发者自身,还是对软件系统乃至产品服务都是非常重要的事情.每个开发者都接触过日志,以至于每个人对日志的了解都会有所不同. 什么是日志 日志是什么呢?老码农看来,日志是带有明确时间标记 ...
- 明明白白炸鸡--APM固件LOG日志全解析线上视频讨论会
经常有人在各大QQ群求分析LOG日志,分析炸鸡原因.我们作为开发者角度以为,不管是航模爱好者和学习研究APM固件的飞控人员,对于LOG日志的分析都是很有必要的. 其实LOG日志里面已经可以分析出绝大多 ...
最新文章
- java web 性能分析_web系统性能分析JavaMelody
- Nature:最强癌基因找到了,居然不在染色体上 | 华人领衔最新研究
- 点击链接微信html代码怎么写,html5微信分享代码怎么写呢?
- dns服务器zones文件,DNS服务安装与配置
- 全志a64linux内核编译,Ubuntu16.04编译AndroidM(SoC:Allwinner A64)
- Java面试题2019简书_2019最新Spring面试题大全含答案之Spring Beans(2019最全Spring超级葵花宝典)...
- 在mysql命令行下执行sql文件
- shell输出毫秒_【Linux】shell: 获取时间间隔到毫秒、微秒级别
- VMware vCenter Server安装与配置
- Java视频在线观看网址
- 金蝶未注册服务器win10,金蝶WIN10下异常问题解决方法
- 打开本地计算机策略,win7本地组策略打开方法介绍
- matlab中将数据存为dat格式,matlab中将数据保存为txt或dat格式四种方案
- 以图搜图 图像匹配_sift 实现以图搜图
- java标书_java软件项目投标技术标书.doc
- Intent.parseUri()详解
- Python中的函数(二)--提高篇
- 【附源码】Python计算机毕业设计农田节水灌溉监测系统
- 文小刚:量子革命是最不可思议的物理革命
- 简述PHP是什么?PHP文件是什么?