在ruby程序中logging到STDOUT(不在Docker中工作)
我正在docker化我的一个ruby应用程序,但我有这个奇怪的logging行为。 它似乎只在程序运行时加载,而不是运行时加载。 当我用docker-compose
运行程序(守护进程)时,我所看到的就是这个:
Starting custom_daemon_1 Attaching to custom_daemon_1
不过,如果我把一个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
没有时间的最重要的是puts
debugging,看看它是否会显示 – 底部的两个是由创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。