【问题标题】:Java Console Pushes Input Text When Logging Occurs发生日志记录时 Java 控制台推送输入文本
【发布时间】:2024-05-01 11:45:02
【问题描述】:

通过MobaXterm 的SSH 功能,我正在远程Linux 服务器上运行Java 应用程序。当我尝试输入终端(通过Scanner 处理用户输入请求)并且发生任何日志记录时,会出现问题。当任何打印语句发生时,我正在输入的文本会自动推送到日志记录部分。

澄清示例:

  1. 我在控制台中手动输入 "MY_INPUT_TO_SET_SOME_VARIABLE 50"(从不按 ENTER)。

  2. 在服务器上发生一些日志记录并自动将手动输入的 “MY_INPUT_TO_SET_SOME_VARIABLE 50”“发送”到显示区域。

    (在上面,您可以看到 50 附加到 09:08,而我从未按 Enter 键)。

所需的行为是允许高级用户在终端的文本区域(或合理的地方)中简单地键入文本,直到按下 ENTER 键。终端文本区域中的文本不应在记录或打印语句时自动推送。我查看了终端设置,但找不到任何可以修改此行为的内容。

【问题讨论】:

  • 看起来很正常。您的提示和日志都打印到标准输出,没有什么可以告诉它阻止(基本上缓冲一些数据),直到用户按 Enter 键。您是否尝试在本地运行类似的东西?
  • 我确实在本地对其进行了测试,这似乎是“正常行为”——我输入的文本总是在任何传入日志记录时附加到较大的文本区域。是否无法将我的输入文本与日志记录大文本区域分开? ..说,我总是在新行上输入任何内容并一直留在那里直到我按ENTER?请参阅 (puu.sh/wY6Dp/acafce9e18.png) 和 (puu.sh/wY6Hh/34dfdb4de4.png) 了解详情。
  • 最初 console aka 终端是围绕“流”概念设计的,因为这就是原始终端所做的:它们只是打印一个字符流。在“流”概念下,您可以分离多个流并以不同方式打印它们。但是如果你把它们混合成一个单一的输出,你就不能只在其中一个中占有一席之地。当基于显示的终端出现时,添加了基于文本的 UI 功能,例如 ncurses,但这是一项高级功能,即使对于这样一个简单的功能,通常也需要应用程序的明确支持。

标签: java shell logging input


【解决方案1】:

正如其他人在评论部分已经提到的那样,您对此行为无能为力。

但是通常您不想登录您正在使用的tty

如果您在所连接的系统上具有 root 权限,则尝试在控制台上抑制日志消息并将它们重定向到日志文件,除非有充分的理由不这样做。由于这取决于谁在发送消息,因此发送消息的方法有所不同。

另一种可能性是在终端中启动screen 会话以打开新的 tty。 为了便于使用,我将直接连接到屏幕会话:

ssh -t user@server /usr/bin/screen

如果你在你连接的用户的主目录中创建一个 .screenrc 文件,把

startup_message off

如果您不喜欢屏幕开始消息,请在其中。您甚至可以使用它来启动您的控制台应用程序,以便在您停止应用程序时结束屏幕会话。

ssh -t user@server /usr/bin/screen your_start_command_here

屏幕具有更多功能,例如命名会话、重新附加到会话等。有关详细信息,请参阅手册。

(屏幕解决方案显然仅在屏幕上的日志消息不是由您的应用程序生成时才有效。在这种情况下,将您的记录器配置为不记录到标准输出)

【讨论】: