遗憾的是,除了在io /内核子系统中正确实现刷新"命令" 并确保实现实际io的低级驱动程序支持这样的命令之外,您必须在关闭之前简单地依赖系统静默.我觉得失败了.
看看io.erl/io_lib.erl在STDLIB和file_io_server.erl/prim_file.erl内核的血淋淋的细节.
例如,在file_io_server(它有效地从io/io_lib获取请求并将其路由到正确的驱动程序),命令类型是:
{put_chars,Chars}
{get_until,...}
{get_chars,...}
{get_line,...}
{setopts, ...}
Run Code Online (Sandbox Code Playgroud)
(即没有冲洗)!
作为替代方案,您当然可以在每次写入后关闭输出(这将强制刷新).我每次都有这样的记录模块,它看起来并不那么慢(它是通过强制转换消息收到日志的gen_server):
case file:open(LogFile, [append]) of
{ok, IODevice} ->
io:fwrite(IODevice, "~n~2..0B ~2..0B ~4..0B, ~2..0B:~2..0B:~2..0B: ~-8s : ~-20s : ~12w : ",
[Day, Month, Year, Hour, Minute, Second, Priority, Module, Pid]),
io:fwrite(IODevice, Msg, Params),
io:fwrite(IODevice, "~c", [13]),
file:close(IODevice);
Run Code Online (Sandbox Code Playgroud)