在ruby程序中logging到STDOUT(不在Docker中工作)

我正在docker化我的一个ruby应用程序,但我有这个奇怪的logging行为。 它似乎只在程序运行时加载,而不是运行时加载。 当我用docker-compose运行程序(守护进程)时,我所看到的就是这个:

 Starting custom_daemon_1 Attaching to custom_daemon_1 

不过,如果我把一个exit部分的方式,我看到我所有的putslogger输出。

 Starting custom_daemon_1 Attaching to custom_daemon_1 custom_daemon_1 | requires custom_daemon_1 | starting logger custom_daemon_1 | Starting loads custom_daemon_1 | Hello base custom_daemon_1 | Loaded track custom_daemon_1 | Loaded geo custom_daemon_1 | Loaded geo_all custom_daemon_1 | Loaded unique custom_daemon_1 | D, [2016-11-14T13:31:19.295785 #1] DEBUG -- : Starting custom_daemon... custom_daemon_1 | D, [2016-11-14T13:31:19.295889 #1] DEBUG -- : Loading xx from disk... custom_daemon_1 exited with code 0 

没有时间的最重要的是putsdebugging,看看它是否会显示 – 底部的两个是由创build:

 Logger.new(STDOUT) LOG = Logger.new(STDOUT) LOG.level = Logger::DEBUG 

然后我会打电话给LOG.debug "xxx"或者LOG.error "xxx"为什么会出现这种奇怪的行为? 当我按ctrl+c出来的第一个,日志仍然不显示。

这最初是由一个.sh脚本运行,现在我打电话直接运行它作为Dockerfile的CMD

有一个python问题,我发现在这里问类似的东西 。 有人推测这可能与PID 1进程有关,logging到STDOUT overdressed。

testing

这是我跑的一个testing:

 puts "starting logger" Logger.new(STDOUT) LOG = Logger.new(STDOUT) LOG.level = Logger::DEBUG puts "this is 'puts'" p "this is 'p'" LOG.debug "this is 'log.debug'" puts "Starting loads" 

输出:

 custom_daemon_1 | starting logger custom_daemon_1 | this is 'puts' custom_daemon_1 | "this is 'p'" 

请注意,前两个puts打印,但只要我尝试使用LOG.debug它不起作用。

testing2

我也决定尝试使用一个文件的logging器,正如所料,它通过dockerlogging到文件很好。

我所做的只是改变Logger.new(STDOUT)Logger.new('mylog.log') ,我可以tail -f mylog.log和所有LOG.debug提示出现。

就像在这个线程中说的那样,运行Rake任务的Docker会在Rails4中logging问题

尝试禁用输出缓冲到STDOUT: $stdout.sync = true

我已经临时解决这个问题,添加一个符号链接来基于这个docker线程 。 在Dockerfile中:

RUN ln -sf /proc/1/fd/1 /var/log/mylog.log并将我的logging器设置为LOG = Logger.new('/var/log/mylog.log')但这有两个不希望的后果。 首先,日志文件会增长,占用空间,可能需要pipe理 – 我不想处理这个问题。 其次,不得不添加一个符号链接来使日志正常工作似乎不雅观…会喜欢另一种解决scheme。