【问题标题】:How can I use `syslog` in Swift如何在 Swift 中使用`syslog`
【发布时间】:2015-10-18 05:53:22
【问题描述】:

看起来syslog() 函数在 Swift 2 中不可用。

如何在 OS X 上向syslog 发送消息?

【问题讨论】:

    标签: macos swift syslog


    【解决方案1】:

    问题是

    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
    • @ValentinShergin:不客气。 – 重新编辑:您对错字是正确的。但是message : String 是故意的并且有效,因为 Swift 字符串在传递给采用 const char * 参数的 C 函数时会自动转换,比较 stackoverflow.com/questions/27063569/…
    • 是的,我在发送编辑后意识到我错了,但是无法取消对 SO 的编辑。对不起,混乱。 :( Swift 很棒,你也很棒。
    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多