Golang 中的跨平台日志记录

Bha*_*rat 5 windows macos logging go

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

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

log.SetOutput(projectsLog)
Run Code Online (Sandbox Code Playgroud)

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

projectsLog *os.File
Run Code Online (Sandbox Code Playgroud)

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

log.Printf("Error: wrong Hra Class value %s in row %v for project/path %s", hraClass, (rowNum + 1), testDir)
Run Code Online (Sandbox Code Playgroud)

这在 Mac 上运行得很好。使用 log.Printf 的每一行都记录在单独的行上,但在 Windows 上,换行符不显示,并且我得到一行没有换行符。我很清楚unix和windows之间的“\r”和“\r\n”区别。但我认为 log.Printf 会根据其运行的平台而适当地表现?

如果我的假设是错误的,那么我必须采取哪些选项来确保日志文件在 Windows 上可读?如果可以的话,我不想传递标志,例如 -platform windows 或类似的东西。这件事能以透明的方式处理吗?

icz*_*cza 1

如前所述,无论操作系统如何(Windows 上也是如此),该fmt包始终用作换行“序列”。\n该包在引擎盖下log使用,因此这也适用于。当调用不以 结尾的函数时(例如),a将按照(转发到的)中记录的方式显式打印。fmtlog...ln()log.Printf()\nLogger.Output()log.Printf()

\n只需作为换行符处理即可。如果您确实需要 print \r\n,则必须通过\r在格式字符串末尾附加一个字符来手动处理,例如:

log.Printf("This will be terminated by CR+LF\r") // \n is appended automatically
Run Code Online (Sandbox Code Playgroud)

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

func winprintf(format string, a ...interface{}) {
    log.Printf(format+"\r", a...)
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这只会打印\r\n在日志条目的末尾;但是如果您\n在格式字符串中使用或参数是s (或者通过调用它们的方法string将导致)包含,那么这些将不会自动变成。您也可以用来处理这些。stringString()\n\r\nstrings.Replace()