无法在 Swift 上创建 OSLog activity
Can't create the OSLog activity on Swift
我想使用 OSLog 活动来构建我的日志,但我遇到了 Swift 上缺少 activity 常量的问题,例如 OS_ACTIVITY_CURRENT
和 OS_ACTIVITY_NONE
当我尝试创建 activity:
时出现错误
let activity = _os_activity_create(dso, strdup(name),
OS_ACTIVITY_CURRENT, // Error: Static member 'OS_ACTIVITY_CURRENT' cannot be used on instance of type 'OSLogOutput'
OS_ACTIVITY_FLAG_DEFAULT)
os.activity
框架描述了 activity 没有任何定义的常量(但定义了 activity 标志 OS_ACTIVITY_FLAG_DEFAULT
、OS_ACTIVITY_FLAG_DETACHED
、OS_ACTIVITY_FLAG_IF_NONE_PRESENT
):
/*!
* @const OS_ACTIVITY_CURRENT
*
* @discussion
* Create activity and links to the current activity if one is present.
* If no activity is present it is treated as if it is detached.
*/
如果我们查看 ObjC headers <os/activity.h>
我们可以找到这些常量:
#define OS_ACTIVITY_NONE OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_none)
#define OS_ACTIVITY_CURRENT OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_current)
看来 OSLog 受限于 Swift 那么如何使用 OSLog 活动或在哪里可以找到常量?
经过一些研究,我发现 OS_ACTIVITY_CURRENT
和 OS_ACTIVITY_NONE
可以使用 C-Interoperability 动态加载,因为它没有暴露给 Swift:
static let RTLD_DEFAULT = UnsafeMutableRawPointer(bitPattern: -2)
static let OS_ACTIVITY_NONE = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_none"), to: os_activity_t.self)
static let OS_ACTIVITY_CURRENT = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_current"), to: os_activity_t.self)
但为什么 os.log 框架提供了 API 而没有提供所需的常量,这看起来仍然很奇怪。
感谢https://nsscreencast.com/episodes/347-activity-tracing-in-swift
我想使用 OSLog 活动来构建我的日志,但我遇到了 Swift 上缺少 activity 常量的问题,例如 OS_ACTIVITY_CURRENT
和 OS_ACTIVITY_NONE
当我尝试创建 activity:
let activity = _os_activity_create(dso, strdup(name),
OS_ACTIVITY_CURRENT, // Error: Static member 'OS_ACTIVITY_CURRENT' cannot be used on instance of type 'OSLogOutput'
OS_ACTIVITY_FLAG_DEFAULT)
os.activity
框架描述了 activity 没有任何定义的常量(但定义了 activity 标志 OS_ACTIVITY_FLAG_DEFAULT
、OS_ACTIVITY_FLAG_DETACHED
、OS_ACTIVITY_FLAG_IF_NONE_PRESENT
):
/*!
* @const OS_ACTIVITY_CURRENT
*
* @discussion
* Create activity and links to the current activity if one is present.
* If no activity is present it is treated as if it is detached.
*/
如果我们查看 ObjC headers <os/activity.h>
我们可以找到这些常量:
#define OS_ACTIVITY_NONE OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_none)
#define OS_ACTIVITY_CURRENT OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_current)
看来 OSLog 受限于 Swift 那么如何使用 OSLog 活动或在哪里可以找到常量?
经过一些研究,我发现 OS_ACTIVITY_CURRENT
和 OS_ACTIVITY_NONE
可以使用 C-Interoperability 动态加载,因为它没有暴露给 Swift:
static let RTLD_DEFAULT = UnsafeMutableRawPointer(bitPattern: -2)
static let OS_ACTIVITY_NONE = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_none"), to: os_activity_t.self)
static let OS_ACTIVITY_CURRENT = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_current"), to: os_activity_t.self)
但为什么 os.log 框架提供了 API 而没有提供所需的常量,这看起来仍然很奇怪。
感谢https://nsscreencast.com/episodes/347-activity-tracing-in-swift