在 Kubernetes 中 运行 Haskell 应用程序没有 stdout/stderror 输出
No stdout/stderror output when running Haskell application in Kubernetes
我 运行 遇到了一个非常奇怪的问题,当 运行 通过 Kubernetes 时,我似乎没有从 Haskell 应用程序获得任何 stdout/stderr 输出.
我正在使用非常基本的 putStrLn
来写入标准输出。
如果我在 Kubernetes 环境中手动输入容器并通过 shell 运行 应用程序 - 我会看到预期的输出。
这个问题的可能原因是什么/
这似乎是由于在输出到 kubernetes 日志记录时在 "block" 模式下设置了输出缓冲。
通过将缓冲设置为 LineBuffering
来修复:
import System.IO
...
hSetBuffering stdout LineBuffering
hSetBuffering stderr LineBuffering
http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t:BufferMode
The default buffering mode when a handle is opened is
implementation-dependent and may depend on the file system object
which is attached to that handle. For most implementations, physical
files will normally be block-buffered and terminals will normally be
line-buffered.
感谢来自 fp slack 的 Jesse Kempf 向我指出了这一点!
我 运行 遇到了一个非常奇怪的问题,当 运行 通过 Kubernetes 时,我似乎没有从 Haskell 应用程序获得任何 stdout/stderr 输出.
我正在使用非常基本的 putStrLn
来写入标准输出。
如果我在 Kubernetes 环境中手动输入容器并通过 shell 运行 应用程序 - 我会看到预期的输出。
这个问题的可能原因是什么/
这似乎是由于在输出到 kubernetes 日志记录时在 "block" 模式下设置了输出缓冲。
通过将缓冲设置为 LineBuffering
来修复:
import System.IO
...
hSetBuffering stdout LineBuffering
hSetBuffering stderr LineBuffering
http://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#t:BufferMode
The default buffering mode when a handle is opened is implementation-dependent and may depend on the file system object which is attached to that handle. For most implementations, physical files will normally be block-buffered and terminals will normally be line-buffered.
感谢来自 fp slack 的 Jesse Kempf 向我指出了这一点!