print、NSLog和println之间有什么区别?我应该在什么时候使用它们?例如,在Python中,如果我想打印一个字典,我只需要print myDict,但是现在我有两个其他的选项,我应该如何以及何时使用它们?
print
NSLog
println
print myDict
f5emj3cl1#
几个不同之处:
terminator
""
printf
NSLog("%0.4f", CGFloat.pi)
这将产生:[28937:1751492]我的手机应用程序[28937:1751492]
Logger
现在,虽然NSLog仍然有效,但我们通常会使用“统一日志”(见下文)而不是NSLog。
os
import os
log
let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network") logger.log("url = \(url)")
当您通过外部控制台应用观察应用时,您可以根据subsystem和category进行过滤。将调试消息与(a)其他子系统代表您的应用生成的消息或(b)其他类别或类型的消息区分开来非常有用。
subsystem
category
.info
.debug
.error
.fault
.critical
.notice
.trace
logger.error("web service did not respond \(error.localizedDescription)")
因此,如果使用外部控制台应用程序,您可以选择仅查看特定类别的消息(例如,如果您在控制台“操作”菜单上选择“包括调试消息”,则仅显示调试消息)。这些设置还规定了许多有关是否将内容记录到磁盘的微妙问题细节。请参阅WWDC视频了解更多详细信息。
网址=如果您确信此邮件不会包含用户机密数据,并且您希望在macOS控制台中看到这些字符串,则必须执行以下操作:
logger.log("url = \(url, privacy: .public)")
os_log
os.log
import os.log
let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "network")
os_log("url = %@", log: log, url.absoluteString)
.default
os_log("web service did not respond", type: .error)
logger.log("url = \(url)")
但是对于os_log,您必须执行以下操作:
os_log("url = %@", url.absoluteString)
%{public}@
%@
os_log("url = %{public}@", url.absoluteString)
let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
并开始一个范围:
os_signpost(.begin, log: pointsOfInterest, name: "Network request")
并以以下内容结束:
os_signpost(.end, log: pointsOfInterest, name: "Network request")
如需详细信息,请参阅https://stackoverflow.com/a/39416673/1271826。总之,print对于Xcode的简单日志记录来说已经足够了,但统一日志记录(无论是Logger还是os_log)实现了同样的功能,但提供了更强大的功能。在调试需要在Xcode之外测试的iOS应用时,统一日志的强大功能会得到充分的体现。例如,在测试后台iOS应用进程(如后台获取)时,需要连接到Xcode调试器changes the app lifecycle。因此,您经常会希望在物理设备上进行测试,从设备本身运行应用。不从Xcode的调试器启动应用程序。统一日志记录让您仍然可以从macOS Console应用程序查看iOS设备日志语句。
kupeojn62#
如果您使用的是Swift 2,现在您只能使用print()将内容写入输出。Apple将**println()和print()**函数合并为一个函数。
已更新至iOS 9
默认情况下,该函数通过添加换行符来终止它所打印的行。
print("Hello Swift")
终结者若要打印后面不带换行符的值,请传递一个空字符串作为终止符
print("Hello Swift", terminator: "")
分隔符
现在可以使用分隔符连接多个项目
print("Hello", "Swift", 2, separator:" ")
两者皆是
或者你可以合并这种方式
print("Hello", "Swift", 2, separator:" ", terminator:".")
yshpjwxd3#
debugPrint()
CustomDebugStringConvertible
不要忘记debugPrint(),它的工作原理与print()类似,但most suitable for debugging除外。示例:
print()
*字符串
print("Hello World!")
Hello World
debugPrint("Hello World!")
"Hello World"
print(1..<6)
1..<6
debugPrint(1..<6)
Range(1..<6)
任何类都可以通过**CustomDebugStringConvertible**协议自定义其调试字符串表示。
jtjikinw4#
为了补充Rob的答案,自iOS 10.0以来,苹果推出了全新的“统一日志记录”系统,该系统取代了现有的日志记录系统(包括ASL和Syslog、NSLog),并在性能上超越了现有的日志记录方法,这要归功于其日志数据压缩和延迟数据收集等新技术。来自Apple:统一的日志记录系统提供了一个单一、高效、高性能的API,用于在系统的所有级别上捕获消息。此统一的系统将日志数据集中存储在内存和磁盘上的数据存储中。Apple强烈推荐使用os_log来记录各种消息,包括信息、调试和错误消息,因为与以前的日志系统相比,它的性能有了很大的提高,而且它的集中式数据收集允许开发人员方便地检查日志和活动。事实上,新系统的内存占用很可能很低,不会导致“观察者效应,”即如果插入一个日志记录命令,bug就会消失,从而干扰bug发生的时间。
您可以在详细信息here中了解更多信息。总结一下:为方便起见,请使用print()进行个人调试(但在用户设备上部署时,消息不会被记录)。然后,尽可能多地使用统一日志记录(os_log)进行其他操作。
gg58donl5#
iOS记录器
@import Foundation NSLog("SomeString")
@import Foundation print("SomeString")
\n
@import os.log os_log("SomeIntro: %@", log: .default, type: .info, "someString")
@import os let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "someCategory") logger.log("\(s)")
mzsu5hc06#
还有另一种方法dump(),也可以用于日志记录:
dump()
func dump<T>(T, name: String?, indent: Int, maxDepth: Int, maxItems: Int)
使用对象到标准输出的镜像转储对象的内容。从Swift Standard Library Functions开始
6条答案
按热度按时间f5emj3cl1#
几个不同之处:
print
与println
的比较:调试应用程序时,
print
函数会在Xcode控制台中打印消息。println
是Swift 2中删除的这个变量的变体,现在不再使用。如果你看到旧代码使用println
,你现在可以安全地用print
替换它。在Swift 1.x中,
print
并没有在打印字符串的末尾添加换行符,而println
却添加了,但是现在,print
总是在字符串的末尾添加换行符,如果你不想让它这样做,可以提供一个terminator
参数""
。NSLog
:NSLog
将时间戳和标识符添加到输出,而print
不会;NSLog
语句同时出现在设备控制台和调试器控制台中,而print
只出现在调试器控制台中。NSLog
在iOS 10-13/macOS 10.12-10.x中使用printf
样式的格式字符串,例如:这将产生:
[28937:1751492]我的手机应用程序[28937:1751492]
NSLog
可以使用字符串插值。(同样,在iOS 14和macOS 11中,我们通常更喜欢Logger
而不是NSLog
。请参阅下一点。)现在,虽然
NSLog
仍然有效,但我们通常会使用“统一日志”(见下文)而不是NSLog
。Logger
接口连接到“统一日志”系统。有关Logger
的介绍,请参见WWDC 2020 Explore logging in Swift。Logger
,必须导入os
:NSLog
一样,统一日志记录也会将消息输出到Xcode调试控制台和设备控制台Logger
和一个log
消息给它:当您通过外部控制台应用观察应用时,您可以根据
subsystem
和category
进行过滤。将调试消息与(a)其他子系统代表您的应用生成的消息或(b)其他类别或类型的消息区分开来非常有用。.info
、.debug
、.error
、.fault
、.critical
、.notice
、.trace
等:因此,如果使用外部控制台应用程序,您可以选择仅查看特定类别的消息(例如,如果您在控制台“操作”菜单上选择“包括调试消息”,则仅显示调试消息)。这些设置还规定了许多有关是否将内容记录到磁盘的微妙问题细节。请参阅WWDC视频了解更多详细信息。
网址=
如果您确信此邮件不会包含用户机密数据,并且您希望在macOS控制台中看到这些字符串,则必须执行以下操作:
os_log
来实现“统一日志”。关于统一日志的一般介绍,请参见WWDC 2016视频Unified Logging and Activity Tracing。os.log
:subsystem
和category
:os_log
时,您将使用printf样式模式而不是字符串插值:.info
、.debug
、.error
、.fault
(或.default
):os_log
时不能使用字符串插值。例如,对于print
和Logger
,您可以:但是对于
os_log
,您必须执行以下操作:os_log
也实施了同样的数据隐私,但是你在printf格式化程序中指定了公共可见性(例如%{public}@
而不是%@
)。例如,如果你想从外部设备上看到它,你必须做:并开始一个范围:
并以以下内容结束:
如需详细信息,请参阅https://stackoverflow.com/a/39416673/1271826。
总之,
print
对于Xcode的简单日志记录来说已经足够了,但统一日志记录(无论是Logger
还是os_log
)实现了同样的功能,但提供了更强大的功能。在调试需要在Xcode之外测试的iOS应用时,统一日志的强大功能会得到充分的体现。例如,在测试后台iOS应用进程(如后台获取)时,需要连接到Xcode调试器changes the app lifecycle。因此,您经常会希望在物理设备上进行测试,从设备本身运行应用。不从Xcode的调试器启动应用程序。统一日志记录让您仍然可以从macOS Console应用程序查看iOS设备日志语句。
kupeojn62#
如果您使用的是Swift 2,现在您只能使用print()将内容写入输出。
Apple将**println()和print()**函数合并为一个函数。
已更新至iOS 9
默认情况下,该函数通过添加换行符来终止它所打印的行。
终结者
若要打印后面不带换行符的值,请传递一个空字符串作为终止符
分隔符
现在可以使用分隔符连接多个项目
两者皆是
或者你可以合并这种方式
yshpjwxd3#
此外,Swift 2有
debugPrint()
(和CustomDebugStringConvertible
协议)!不要忘记
debugPrint()
,它的工作原理与print()
类似,但most suitable for debugging除外。示例:
*字符串
print("Hello World!")
变为Hello World
debugPrint("Hello World!")
变为"Hello World"
(引号!)*范围
print(1..<6)
变为1..<6
debugPrint(1..<6)
变为Range(1..<6)
任何类都可以通过**
CustomDebugStringConvertible
**协议自定义其调试字符串表示。jtjikinw4#
为了补充Rob的答案,自iOS 10.0以来,苹果推出了全新的“统一日志记录”系统,该系统取代了现有的日志记录系统(包括ASL和Syslog、NSLog),并在性能上超越了现有的日志记录方法,这要归功于其日志数据压缩和延迟数据收集等新技术。
来自Apple:
统一的日志记录系统提供了一个单一、高效、高性能的API,用于在系统的所有级别上捕获消息。此统一的系统将日志数据集中存储在内存和磁盘上的数据存储中。
Apple强烈推荐使用
os_log
来记录各种消息,包括信息、调试和错误消息,因为与以前的日志系统相比,它的性能有了很大的提高,而且它的集中式数据收集允许开发人员方便地检查日志和活动。事实上,新系统的内存占用很可能很低,不会导致“观察者效应,”即如果插入一个日志记录命令,bug就会消失,从而干扰bug发生的时间。您可以在详细信息here中了解更多信息。
总结一下:为方便起见,请使用
print()
进行个人调试(但在用户设备上部署时,消息不会被记录)。然后,尽可能多地使用统一日志记录(os_log
)进行其他操作。gg58donl5#
iOS记录器
NSLog
-添加 meta信息(如时间戳和标识符)并允许您输出1023个符号。还将消息打印到控制台。这是最慢的方法。由于其他应用程序可以访问日志文件,因此不安全print
-将all字符串打印到Xcode。性能比以前的更好println
(仅适用于Swift v1),并在字符串末尾添加\n
os_log
(来自iOS v10)-打印32768个符号也打印到控制台。性能比以前更好Logger
(来自iOS v14)-打印32768个符号也打印到控制台。性能比以前更好mzsu5hc06#
还有另一种方法
dump()
,也可以用于日志记录:使用对象到标准输出的镜像转储对象的内容。
从Swift Standard Library Functions开始