我该如何在Swift中使用`syslog`?

5

看起来在Swift 2中没有syslog()函数。

我该如何向OS X的syslog发送消息?

1个回答

2

问题在于

void syslog(int priority, const char *message, ...);

这个函数接受可变参数列表,但在Swift中不被导入。你可以使用

void vsyslog(int priority, const char *message, va_list args);

可以使用Swift中的“instead”关键字并定义一个包装函数:

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()只是一个包装器,用于“苹果系统日志记录器设施”。你可以直接调用asl_XXX函数,只需在桥接头文件中#include <asl.h>。与上面一样,asl_log()没有被导入到Swift中,你必须调用asl_vlog()

太棒了!谢谢!我已经找到了 vsyslog,但是我不知道如何使用 CVaListPointer - Valentin Shergin
@ValentinShergin:不用谢。关于你的编辑:你是对的,那个错别字是我写错了。但是 message : String 是有意的,并且有效,因为当传递给一个接受 const char * 参数的 C 函数时,Swift 字符串会自动转换,可以参考 https://dev59.com/wV8d5IYBdhLWcg3wNAGy。 - Martin R
是的,我在发送编辑后意识到自己错了,但是在SO上没有撤消编辑的方法。抱歉造成混乱。 :( Swift很棒,你也很棒。 - Valentin Shergin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接