写操作后日志文件中未出现数据

我有以下代码:

time = os.date("*t")
data = io.open("test.txt", "a")

function applicationWatcher(appName, eventType, appObject)
    if (eventType == hs.application.watcher.launched) then
        data:write("" .. appName .. " 在 ".. ("%02d:%02d:%02d:%02d:%02d:%02d"):format(time.day, time.month, time.year, time.hour, time.min, time.sec))
    end
end

local appWatcher = hs.application.watcher.new(applicationWatcher)
appWatcher:start()

此代码可以监测 macOS 上的应用程序启动情况。我想让程序将时间、日期和应用程序名称记录到文件中,以便我可以查看我启动了哪些应用程序以及何时启动。

但是,我的文本文件中似乎没有任何日志记录。为什么呢?

点赞
用户2505965
用户2505965

文件的输入输出是有缓冲的。这意味着数据不会立即写入文件,而是保存在内存中,直到缓冲区被填满,才会批量写入数据。

一个简单的解决方法是使用file:flush立即将缓冲区中的数据推送到文件中。

data:write('name and timestamp')
data:flush()

更高级的解决方法是使用 file:setvbuf 来设置适当的模式和缓冲区大小:

file:setvbuf (mode [, size])

为一个输出文件设置缓冲模式。有三种可用的模式:

  • “no”:无缓冲,任何输出操作的结果都会立即显示。
  • “full”:全缓冲,只有当缓冲区满或者你显式地调用了 io.flush 时才进行输出操作。
  • “line”:行缓冲,输出被缓存直到一个换行符被输出或在一些特殊文件(如终端设备)中有任何输入。

对于后两种情况,size 指定了缓冲区的大小,以字节为单位。缺省大小是适当的大小。

你可能想要的是“line”缓冲,因为你应该在字符串末尾添加一个换行字符 ('\n'),否则你的日志文件将很难读取。

local data = io.open("test.txt", "a")
data:setvbuf('line')
2016-10-28 16:44:06