【发布时间】:2015-10-18 05:53:22
【问题描述】:
看起来syslog() 函数在 Swift 2 中不可用。
如何在 OS X 上向syslog 发送消息?
【问题讨论】:
看起来syslog() 函数在 Swift 2 中不可用。
如何在 OS X 上向syslog 发送消息?
【问题讨论】:
问题是
void syslog(int priority, const char *message, ...);
接受一个变量参数列表,并且不导入到 Swift 中。你可以 使用
void vsyslog(int priority, const char *message, va_list args);
而是在 Swift 中定义一个包装函数:
func syslog(priority : Int32, _ message : String, _ args : CVarArgType...) {
withVaList(args) { vsyslog(priority, message, $0) }
}
syslog(LOG_ERR, "i=%ld, x=%f", 123, 34.56)
请注意,字符串参数必须作为 C 字符串传递:
syslog(LOG_ERR, "status=%s", "OK".cStringUsingEncoding(NSUTF8StringEncoding))
或者,使用NSLog(),它也会写入系统日志:
NSLog("i=%ld, x=%f, status=%@", 123, 34.56, "OK")
还要注意,在 OS X 上,syslog() 只是
"Apple System Logger facility"。你可以打电话
asl_XXX 直接起作用,你只需要#include <asl.h>
在桥接头文件中。如上,asl_log() 不是
导入到 Swift,你必须改为调用 asl_vlog()。
【讨论】:
vsyslog,但我不知道如何使用CVaListPointer。
message : String 是故意的并且有效,因为 Swift 字符串在传递给采用 const char * 参数的 C 函数时会自动转换,比较 stackoverflow.com/questions/27063569/…。