使用Golang进行跨平台日志记录

5

我正在Mac上开发一个Go程序,该电脑安装了Parallels和Windows系统,以便我可以在两个平台上进行测试。我的程序运行良好。我可以在Mac上编译Windows的".exe"文件,并在Windows上运行它,除了日志文件外都正常工作。

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

log.SetOutput(projectsLog)

在上面声明的项目projectsLog中,如下所示:

projectsLog *os.File

我正在使用log.Printf语句,因为我需要格式化输出。以下是一个示例:
log.Printf("Error: wrong Hra Class value %s in row %v for project/path %s", hraClass, (rowNum + 1), testDir)

在Mac上运行良好。每行使用log.Printf记录在单独的行上,但在Windows上,换行符不会显示,我会得到一行没有换行符的日志。我很清楚Unix和Windows之间的"\r"和"\r\n"的区别。但我认为log.Printf会根据它所运行的平台适当地表现?如果我的假设是错误的,那么我有哪些选项可以确保日志文件在Windows上可读?如果可以的话,我不想传递标志,比如-platform windows或类似的东西。这可以以透明的方式处理吗?

1
你的假设是错误的,log.Printf不会进行任何“Windows魔法”,而是使用适当的\n终止行。只需在Windows上使用一些正常的程序来读取日志文件,“正常”是指其将\n显示为行结束符(例如Notepad++),并避免使用需要\r\n作为行结束符的错误工具。log.Printf或者你的代码没有问题。 - Volker
1
logfmt包不会根据平台更改行尾(顺便说一下,\r只在旧的Mac和其他已经消失的系统上使用)。最好使用能够读取没有回车符的文件的文本编辑器。 - JimB
@volker,谢谢。我安装了Notepad++,它可以很好地读取我的日志文件。不再使用记事本,改用Notepad++。我离开Windows已经有很长一段时间了,所以对它有点生疏。 - Bharat
1个回答

1
正如已经指出的那样,无论在哪个操作系统上(包括 Windows),fmt 包始终使用 \n 作为换行符。 log 包在底层使用了 fmt,因此对于 log 也适用相同的规则。当调用不以 ...ln() 结尾的函数时(例如 log.Printf()),将会显式打印一个 \n,正如在 Logger.Output() 中所记录的一样(log.Printf() 转发到该函数)。
只需将 \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或参数是包含\nstring(或通过调用它们的String()方法将导致成为string),那么这些内容不会自动转换为\r\n。您可以使用strings.Replace()来处理这些内容。

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