在 ruby​​ 程序中登录到 STDOUT(不适用于 Docker)

jQw*_*rdy 3 ruby logging docker docker-compose

我正在 dockerizing 我的一个 ruby​​ 应用程序,但我有这种非常奇怪的日志记录行为。它似乎只在程序结束时加载,而不是在运行时加载。当我运行程序(守护进程)时,docker-compose我看到的是:

Starting custom_daemon_1
Attaching to custom_daemon_1
Run Code Online (Sandbox Code Playgroud)

但是,如果我把一个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
Run Code Online (Sandbox Code Playgroud)

没有时间的顶部只是puts调试,看看它是否会显示 - 底部两个是由以下人员创建的:

Logger.new(STDOUT)
LOG = Logger.new(STDOUT)
LOG.level = Logger::DEBUG
Run Code Online (Sandbox Code Playgroud)

然后我会打电话LOG.debug "xxx"LOG.error "xxx"知道为什么会发生这种奇怪的行为?当我ctrl+c退出第一个时,日志仍然不显示。

这最初是由.sh脚本运行的,现在我已经调用它直接作为CMDDockerfile运行它。

我发现有一个 python 问题在这里问了类似的问题。有人推测这可能与PID 1禁止记录到 STDOUT 的进程有关。

测试

这是我运行的测试:

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"   
Run Code Online (Sandbox Code Playgroud)

输出:

custom_daemon_1  | starting logger
custom_daemon_1  | this is 'puts'
custom_daemon_1  | "this is 'p'"
Run Code Online (Sandbox Code Playgroud)

请注意,前两个puts打印出来了,但是我一尝试使用LOG.debug它就行不通了。

测试 2

我还决定使用文件尝试记录器,并且正如预期的那样,它通过 docker 很好地记录到文件中。

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

gag*_*ago 8

正如在这个线程中所说,在 Rails4 中记录问题,Docker 运行 rake 任务

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