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部分进入程序我看到我puts和logger输出。
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提示都出现了。
| 归档时间: |
|
| 查看次数: |
3328 次 |
| 最近记录: |