gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:57 24 4
gpt4 key购买 nike

我正在对我的一个 ruby​​ 应用程序进行 docker 化,但我遇到了这种非常奇怪的日志记录行为。它似乎只在程序结束时加载,而不是在运行时加载。当我使用 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

没有时间的最上面的只是puts调试,看看它是否会显示 - 下面的两个是由:

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

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

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

我发现有一个 python 问题问类似的问题 here .有人推测这可能与 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"

输出:

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

请注意,前两个 puts 已打印,但当我尝试使用 LOG.debug 时,它没有工作。

测试 2

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

我所做的只是将 Logger.new(STDOUT) 更改为 Logger.new('mylog.log') 并且我可以 tail -f mylog。 log 并显示所有 LOG.debug 提示。

最佳答案

如本帖中所说 Log issue in Rails4 with Docker running rake task

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

关于ruby - 在 ruby​​ 程序中记录到 STDOUT(不适用于 Docker),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com