Java控制台在发生日志记录时推送输入文本

4
通过MobaXterm的SSH功能,我在远程Linux服务器上运行Java应用程序。当我尝试在终端中输入文本(通过Scanner处理用户输入请求时),并且发生任何日志记录时,就会出现问题。任何打印语句发生时,我输入的文本都会自动推送到日志部分。
  1. 我手动在控制台中输入"MY_INPUT_TO_SET_SOME_VARIABLE 50"(但从未按下ENTER键)。

    enter image description here

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

    enter image description here

    (如上图所示,当我从未按下回车键时,50被附加到09:08后面)。

期望的行为是允许高级用户在终端的文本区域(或其他合理位置)中简单地键入文本,直到按下ENTER键。 终端文本区域中的文本不应自动推送到日志记录或打印语句中。 我查看了终端设置,但未能找到任何修改此行为的选项。


4
看起来是正常的行为。你的提示信息和日志都会被打印到标准输出,没有任何指令告诉它要阻塞(即缓存某些数据)直到用户按下回车键。你是否尝试在本地运行类似的程序? - vempo
我在本地测试过了,这似乎是“正常行为”——无论何时记录有任何输入,我所键入的文本始终会附加到较大的文本区域上。不可能将我的输入文本与日志大文本区分开吗?比如说,始终让我所键入的文本位于新行并保持在那里,直到我按下ENTER键?请见(http://puu.sh/wY6Dp/acafce9e18.png)和(http://puu.sh/wY6Hh/34dfdb4de4.png)以获得澄清。 - VILLAIN bryan
1
最初,控制台(也称为终端)是围绕“流”概念设计的,因为这就是最初的终端所做的:它们只是打印字符流。在“流”概念下,您可以分离几个流并以不同的方式打印它们。但是,如果将它们混合成单个输出,则无法在其中一个中保持位置。当基于显示器的终端出现时,文本基UI功能被添加,例如ncurses,但这是一个高级功能,通常需要应用程序的显式支持,即使对于如此简单的功能也是如此。 - SergGr
1个回答

2

正如其他评论中已经提到的,你对这种行为无能为力。

然而,通常情况下,您不希望在您正在使用的tty上记录日志。

如果您在连接的系统上拥有root权限,请尝试抑制控制台上的日志消息并将其重定向到日志文件,除非有充分的理由不这样做。由于发送消息的人不同,因此执行此操作的方法也不同。

另一个可能性是在终端中启动一个screen会话以打开一个新的tty。 为了方便使用,我建议直接连接到一个screen会话中:

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

如果您在连接的用户的主目录中创建了一个.screenrc文件,请将其放置在其中。
startup_message off

如果您不喜欢屏幕启动消息,可以在其中进行设置。甚至可以使用它启动控制台应用程序,这样当您停止应用程序时,屏幕会话也会结束。

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

Screen有更多的功能,比如给会话命名、重新连接到会话等。详细信息请参阅手册。

(显然,如果屏幕上的日志消息不是由您的应用程序产生的,则屏幕解决方案只能起作用。在这种情况下,请配置您的记录器,使其不记录到stdout)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接