我想知道为什么在记录器调试输出之间引发异常?
DEBUG: asdjoasjd
DEBUG: asdjoasjd
DEBUG: asdjoasjd
**RuntimeError: something**
DEBUG: continued debug message
DEBUG: continued debug message
DEBUG: continued debug message而此调试消息是在异常之前生成的?
$stdout.sync = true帮不上忙。
我用的是log4r
发布于 2015-09-08 23:09:09
来自IO#sync文档:
当同步模式为真时,所有输出都会立即刷新到基础操作系统,并且不会在内部缓冲。
这意味着Ruby不会在内部缓冲数据。不幸的是,这并不意味着任何关于OS缓冲的内容,而且操作系统也可能会缓冲数据。
还要注意的是,Log4r使用IO#flush来刷新数据,这保证了数据将被刷新到底层操作系统,但仅此而已。
将ios中的任何缓冲数据刷新到底层操作系统(请注意,这只是Ruby内部缓冲;操作系统也可以缓冲数据)。
您需要的是IO#fsync,它可以立即写入(刷新)所有缓冲的数据。
立即将ios中的所有缓冲数据写入磁盘。注意,fsync与使用IO#sync=不同。后者确保从Ruby的缓冲区中清除数据,但并不保证底层操作系统实际上将其写入磁盘。
您可以子类Log4r::StdoutOutputter并提供自己的#write实现。
示例:
module Log4r
class SyncedStdoutOutputter < StdoutOutputter
def write(data)
super(data)
@out.fsync
rescue NotImplementedError
# fsync not supported by this OS
end
end
end缓冲是很好的,并强烈推荐性能原因,特别是在生产系统。否则,您将面临消耗不必要资源的风险,例如对磁盘施加不必要的压力。
就个人而言,我认为Log4r已经过时,有点不活跃了。我尝试使用本机Logger或至少ActiveSupport::Logger (它基本上提供了一个格式化程序)。看看更现代的替代品,比如日志记录。大多数伐木工人是可互换的。
https://stackoverflow.com/questions/32452527
复制相似问题