Перенаправить вывод команды "puts" в файл журнала

Я работаю над созданием демона в Ruby, используя камень демонов. Я хочу добавить вывод из демона в файл журнала. Мне интересно, какой самый простой способ перенаправить puts с консоли на файл журнала.

Ответ 1

Я бы рекомендовал использовать ruby ​​logger, лучше, чем puts, вы можете иметь несколько уровней журналов, которые вы можете включить/выключить: debug, warn, info, error и т.д.

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

Я использую пакет runit для управления службами ruby, у него есть svlogd, чем перенаправление вывода демона в файл журнала, здесь выполняется script для процесса регистрации:

#!/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"

Ответ 2

Если вам нужно захватить как STDERR, так и STDOUT и не хотите прибегать к регистрации, следуйте простым решением, адаптированным из этого сообщения:

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

Ответ 3

Try

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

Для восстановления:

$stdout = STDOUT

Ответ 4

Или вы можете переопределить команду puts? Работает, вероятно, только в одном файле/классе

def puts(message)
   #write message to file
end