Josh Moore
Josh Moore

Reputation: 13548

Redirect the "puts" command output to a log file

I am working on creating a daemon in Ruby using the daemons gem. I want to add output from the daemon into a log file. I am wondering what is the easiest way to redirect puts from the console to a log file.

Upvotes: 19

Views: 25297

Answers (4)

Eric Walker
Eric Walker

Reputation: 7571

If you need to capture both STDERR and STDOUT and don't want to resort to logging:

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

To restore:

$stdout = STDOUT

Upvotes: 39

Peterdk
Peterdk

Reputation: 16005

Or you can redefine the puts command? Works probably only in a single file/class

def puts(message)
   #write message to file
end

Upvotes: 1

Vitalie
Vitalie

Reputation: 736

I should recommend to use ruby logger, it is better than puts, you can have multiple log levels that you can turn on/off: debug, warn, info,error, etc.

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

I use runit package to manage ruby services, it has svlogd than will redirect daemon output to log file, here is run script for logger process:

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

Upvotes: 13

Pistos
Pistos

Reputation: 23792

Try

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

To restore:

$stdout = STDOUT

Upvotes: 14

Related Questions