在 Kubernetes 中运行 Haskell 应用程序时没有 stdout/stderror 输出或延迟

问题描述 投票:0回答:1

我遇到了一个非常奇怪的问题,当通过 Kubernetes 运行时,我似乎没有从 Haskell 应用程序获得任何 stdout/stderr 输出。

我正在使用非常基本的

putStrLn
来写入标准输出。

如果我在 Kubernetes 环境中手动输入容器并通过 shell 运行应用程序 - 我会看到预期的输出。

此问题的原因可能是什么/

haskell kubernetes output-buffering
1个回答
4
投票

这似乎是由于输出到 kubernetes 日志记录时将输出缓冲设置为“块”模式造成的。

通过将缓冲设置为

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

打开句柄时默认的缓冲模式是 依赖于实现并且可能依赖于文件系统对象 它连接到该手柄上。对于大多数实现,物理 文件通常是块缓冲的,终端通常是 行缓冲。

感谢 fp slack 的 Jesse Kempf 向我指出了这一点!

© www.soinside.com 2019 - 2024. All rights reserved.