跨平台登录Golang

时间:2016-02-22 14:05:50

标签: windows macos logging go

我正在Mac上开发一个Go程序,它在Windows上安装了Parallels,这样我就可以在两个平台上进行测试。我的程序效果很好。我可以在我的Mac上编译Windows“.exe”文件并从Windows运行它,除日志文件外它运行良好。

我已将记录器设置为将其输出写入如下文件:

void validateSave() {
        if (getObjectId() == null) {
            throw new IllegalArgumentException("Cannot save a ParseUser until it has been signed up. Call signUp first.");
        }

        if (!isAuthenticated() && isDirty()) {
            throw new IllegalArgumentException("Cannot save a ParseUser that is not authenticated.");
        }
    }

其中projectsLog在其上面声明,如下所示:

log.SetOutput(projectsLog)

我正在使用log.Printf语句,因为我想要格式化输出。示例如下所示:

projectsLog *os.File

这在Mac上运行良好。使用log.Printf的每一行都记录在一个单独的行上,但在Windows上,换行符不显示,我得到一行没有换行符。我很清楚unix和windows之间的“\ r”和“\ r \ n”区别。但是我认为log.Printf会根据它运行的平台运行得恰到好处吗?

如果我的假设是错误的,那么我有哪些选项可以确保日志文件在Windows上可读?如果可以的话,我不想传递旗帜,例如 - 平台窗口或某些东西。这可以透明的方式处理吗?

1 个答案:

答案 0 :(得分:0)

如上所述,fmt包始终使用\n作为换行符"序列"无论操作系统如何(在Windows上也是如此)。 log包使用了fmt,因此同样适用于log。当调用不以...ln()结尾的函数时(例如log.Printf()),将\n显式打印log.Printf(),如Logger.Output()所述(向\n转发到)。

只需将\r\n作为换行符处理即可。如果确实需要打印\r,则必须通过在格式字符串的末尾添加log.Printf("This will be terminated by CR+LF\r") // \n is appended automatically 字符来手动处理,例如:

func winprintf(format string, a ...interface{}) {
    log.Printf(format+"\r", a...)
}

您可以为它创建一个包装函数:

\r\n

请注意,这只会在日志条目末尾打印\n;但是如果您在格式字符串中使用string或参数为string s(或者通过调用String()方法生成\n\r\n ,那些不会自动变成age。您也可以使用strings.Replace()来处理这些问题。

相关问题