导致Ruby记录器自动刷新
我使用的是标准的Ruby 2.2记录器(即,不是Rails的记录器),因为我想将其用作旋转记录器,所以我使用shift_age和shift_time将其称为,并向其传递一个文件名,而不是一个打开的文件句柄,如下所示:导致Ruby记录器自动刷新,ruby,logging,Ruby,Logging,我使用的是标准的Ruby 2.2记录器(即,不是Rails的记录器),因为我想将其用作旋转记录器,所以我使用shift_age和shift_time将其称为,并向其传递一个文件名,而不是一个打开的文件句柄,如下所示: Logger.new('my_file.log', 4, 100_000) 我想使这个记录器的输出无缓冲,但是我在记录器接口中找不到任何允许这样做的方法 在我使用这个记录器的特殊方式中(我用自己的类包装记录器,它可以进行定制),我的代码中有一个中心点,每个日志请求都要经过这个中心
Logger.new('my_file.log', 4, 100_000)
我想使这个记录器的输出无缓冲,但是我在记录器接口中找不到任何允许这样做的方法
在我使用这个记录器的特殊方式中(我用自己的类包装记录器,它可以进行定制),我的代码中有一个中心点,每个日志请求都要经过这个中心点,因此如果我可以找到底层IO对象,我可以在这个点上进行同步,但我也不知道如何找到这个IO对象
有什么想法吗?您不需要设置
sync
。在创建日志文件时,Logger
已经设置了:
def create_logfile(filename)
begin
logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
logdev.flock(File::LOCK_EX)
logdev.sync = true
add_log_header(logdev)
logdev.flock(File::LOCK_UN)
rescue Errno::EEXIST
# file is created by another process
logdev = open_logfile(filename)
logdev.sync = true
end
logdev
end
来源:你说的无缓冲是什么意思?例如,当您编写
logger.info
时,输出会立即出现在日志文件中。我可以问您,这是在哪里记录的吗?我在文档中没有发现任何关于Logger会在其IO句柄上将sync设置为true的内容,但是当我搜索该主题时,我在各种论坛讨论中发现Logger输出不会自动刷新(但是我也没有找到任何有用的解决方案)。也许我必须深入研究Logger的源代码才能得到权威性的答案……我想要两者,在终端中打印日志
,最后创建一个日志文件。我该怎么做?@paul如果你想同时做这两件事,这里有一些解决方案: