将“puts”命令的输出重定向到日志文件

18

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


使用这个 LOGGER ||= Logger.new("| tee #{settings.root}/log/migration_script_logger.log", "monthly"),它会同时完成两个任务。 - vs4vijay
4个回答

39
如果您需要捕获标准错误输出和标准输出,而不想使用日志记录,请尝试以下方法:
$stdout.reopen("my.log", "w")
$stdout.sync = true
$stderr.reopen($stdout)

恢复:

$stdout = STDOUT

1
谢谢,这个与这个结合使用效果非常好! - TheDeadSerious
2
如果您希望puts指令同时输出到终端和日志文件,该怎么办呢?例如:行为类似于ruby myscript.rb | tee my.log - wim
1
@wim 我知道这条评论有点老了,但是这里列出了一些解决方案 https://dev59.com/LGw15IYBdhLWcg3wxukh - Jerska
1
命令$stdout.reopen("my.log", "w")破坏了我的Rails控制台(我不得不杀死进程)。正在寻找其他解决方案。 - Alex C
@AlexC,在Rails中有Rails记录器:http://guides.rubyonrails.org/debugging_rails_applications.html#the-logger。 - Eric Walker

14

尝试

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

恢复:

$stdout = STDOUT

13

我建议使用Ruby的日志记录器(logger),它比puts更好,你可以拥有多个日志级别,可以随时打开/关闭:debug、warn、info、error等。

 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"

17
这并没有真正回答问题。如果你无法控制执行puts操作的人,而你想要捕获通常会写入到STDOUT的内容,并将它们写入文件,该怎么办? - silvamerica

1

或者你可以重新定义 puts 命令?但这只能在单个文件/类中起作用。

def puts(message)
   #write message to file
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接