首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使log4r输出消息同步?

如何使log4r输出消息同步?
EN

Stack Overflow用户
提问于 2015-09-08 08:12:33
回答 1查看 111关注 0票数 0

我想知道为什么在记录器调试输出之间引发异常?

代码语言:javascript
复制
  DEBUG: asdjoasjd
  DEBUG: asdjoasjd 
  DEBUG: asdjoasjd
  **RuntimeError: something**
  DEBUG: continued debug message
  DEBUG: continued debug message
  DEBUG: continued debug message

而此调试消息是在异常之前生成的?

$stdout.sync = true帮不上忙。

我用的是log4r

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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实现。

示例:

代码语言:javascript
复制
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 (它基本上提供了一个格式化程序)。看看更现代的替代品,比如日志记录。大多数伐木工人是可互换的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32452527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档