【问题标题】:Redirect the "puts" command output to a log file将“puts”命令输出重定向到日志文件
【发布时间】:2010-09-18 11:30:19
【问题描述】:

我正在使用 daemons gem 在 Ruby 中创建一个守护程序。我想将守护程序的输出添加到日志文件中。我想知道将puts 从控制台重定向到日志文件的最简单方法是什么。

【问题讨论】:

  • 使用这个LOGGER ||= Logger.new("| tee #{settings.root}/log/migration_script_logger.log", "monthly"),这两个都可以

标签: ruby daemon


【解决方案1】:

如果您需要同时捕获 STDERR 和 STDOUT 并且不想使用日志记录,以下是改编自 this post 的简单解决方案:

$stdout.reopen("my.log", "w")
$stdout.sync = true
$stderr.reopen($stdout)

【讨论】:

  • 谢谢,与this 配合使用效果非常好!
  • 如果你想让puts仍然去终端,以及日志文件怎么办?例如ruby myscript.rb | tee my.log 之类的行为
  • @wim 我知道这条评论有点老了,但这里列出了一些解决方案stackoverflow.com/questions/6407141/…
  • 命令$stdout.reopen("my.log", "w") 破坏了我的rails 控制台(我必须终止进程)。研究其他解决方案。
  • @AlexC,在 Rails 中有 Rails 记录器:guides.rubyonrails.org/…
【解决方案2】:

我应该推荐使用 ruby​​ logger,它比 puts 更好,你可以有多个可以打开/关闭的日志级别:调试、警告、信息、错误等。

 logger = Logger.new(STDOUT)
 logger = Logger.new("/var/log/my-daemon.log")

我使用 runit 包来管理 ruby​​ 服务,它有 svlogd,而不是将守护进程输出重定向到日志文件,这里是记录器进程的运行脚本:

#!/bin/sh
set -e

LOG=/var/log/my-daemon

test -d "$LOG" || mkdir -p -m2750 "$LOG" && chown nobody:adm "$LOG"
exec chpst -unobody svlogd -tt "$LOG"

【讨论】:

  • 这并不能真正回答问题。如果您无法控制谁在执行 puts 并且您想要捕获通常会写入 STDOUT 的内容并将它们写入文件怎么办?
【解决方案3】:

试试

$stdout = File.new( '/tmp/output', 'w' )

恢复:

$stdout = STDOUT

【讨论】:

    【解决方案4】:

    或者您可以重新定义puts 命令?可能只在单个文件/类中工作

    def puts(message)
       #write message to file
    end
    

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 2023-01-10
      • 2019-03-20
      • 1970-01-01
      • 2018-06-07
      • 2013-04-15
      相关资源
      最近更新 更多