【问题标题】:tomcat send same request to all instance of web servertomcat 向所有 Web 服务器实例发送相同的请求
【发布时间】:2016-08-11 14:32:29
【问题描述】:

我们有 servlet 应用程序对 Web 服务器进行配置更改(到 log4j)。我们在同一台机器上运行多个 Tomcat Web 服务器实例(作为多个进程)。这是为了负载平衡。当我们将此配置更改作为 servlet 应用程序的请求发送时,我们希望将该更改应用于所有实例。但它只影响一个实例。我们需要重试多次,但仍然无法连接到一两个实例(负载平衡的工作方式)。有没有办法自动将请求发送到所有tomcat实例。

【问题讨论】:

  • 当您“发送”配置更改时,您是如何执行此操作的?它是作为调用还是文件修改完成的?如果它是通过代码完成的,那么将其作为示例将会很有用。
  • 是代码。这是一个 log4j 日志级别更改。我们只需使用下面的代码来设置它 Logger.getLogger("XXXXX").setLevel(Level.INFO);

标签: java tomcat servlets


【解决方案1】:

而不是调用

Logger.getLogger("XXXXX").setLevel(Level.INFO);

你可以考虑打电话

Logger.getRootLogger();

这将返回 Logger 层次结构的根节点,然后您可以使用它来调用

getLoggerRepository();

然后您可以遍历此层次结构,设置每个子节点的级别(注意:文档指出在根记录器上使用 setLevel 可能会产生“灾难性”影响,因此不要尝试将其作为捷径)!

这应该允许您以您期望的方式迭代实例。

【讨论】:

  • 我不明白这将如何让我迭代到所有实例。有几种方法可以设置日志记录级别。这不是这里的问题。您能否解释一下如何做“这应该允许您以您期望的方式迭代实例。”
  • 每个 Apache 实例都有自己的 Logger,它们位于一个层次结构中。因此,如果您只是在Logger.getLogger() 调用的结果上使用setLevel(),那么您只会更改该实例的日志级别。这是您看到的行为。
  • 因此,请使用Logger.getRootLogger() 方法来获取树的基础。在该基础级别,您可能能够使用setLevel() 为所有实例设置值(尽管不推荐这样做)。您还会在该级别找到一些方法,这些方法可以让您迭代 Logger 的层次结构,从而独立地为每个实例单独设置 Log Level。
  • 有一些使用getRootLogger()here修改log4j日志级别的好例子
  • 感谢您提供的信息,但我们无法单独更改根记录器级别。我们有许多不同的记录器来将不同类型的消息记录到不同的文件中。如果我们单独更改根记录器级别,那么它会将所有内容记录在一个文件中。另外我不知道它是否会影响所有实例,因为它们是单独的进程(但没关系,因为我们不想更改根记录器)。
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2012-12-20
相关资源
最近更新 更多