【问题标题】:How to specify an individual log format for Tomcat's console-log using java.util.logging.SimpleFormatter如何使用 java.util.logging.SimpleFormatter 为 Tomcat 的控制台日志指定单独的日志格式
【发布时间】:2019-11-05 01:32:28
【问题描述】:

我在我的 Tomcat 安装上部署了几个 webapp,我在我的 context.xml 中使用 swallowOutput="true" 以实现不同的“每个 webapp”日志输出,而不仅仅是一个大的 catalina.out适用于所有网络应用程序。那个工作很好。因此,我为每个 webapp 使用logging.properties-file。

webapps 正在使用基本的System.out.println 生成日志输出。

现在,我想定义一个非常简单的日志格式,通过指定由 Tomcat 生成

java.util.logging.SimpleFormatter.format=%5$s %n

但是,生成的日志总是显示我不需要的完整格式,无论/如何我指定上面的格式字符串:

22-Jun-2019 16:08:15.310 INFO [http-nio-80-exec-10] org.apache.catalina.core.StandardWrapperValve.invoke backend Sat Jun 22 16:08:15 CEST 2019: ... output of the servlet's System.out.println-calls ...

我想生成一个小而清晰的日志,每行中没有“StandardWrapperValve”等标记。

我的全局logging.properties 文件是这样的:

# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.SimpleFormatter

java.util.logging.SimpleFormatter.format=%5$s %n

org.apache.juli.SimpleFormatter.format=%5$s %n

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

# To see debug messages in TldLocationsCache, uncomment the following line:
#org.apache.jasper.compiler.TldLocationsCache.level = FINE

# To see debug messages for HTTP/2 handling, uncomment the following line:
#org.apache.coyote.http2.level = FINE

# To see debug messages for WebSocket handling, uncomment the following line:
#org.apache.tomcat.websocket.level = FINE

每个 webapp 的 logging.properties 文件是这样的:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = webappX.

java.util.logging.ConsoleHandler.level = FINE

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%5$s %n
1catalina.java.util.logging.SimpleFormatter.format=%5$s %n
org.apache.juli.SimpleFormatter.format=%5$s %n

如您所见,我已经尝试了不同的行将格式字符串设置为不同的类名,例如:

  • java.util.logging.SimpleFormatter.format
  • 1catalina.java.util.logging.SimpleFormatter.format
  • org.apache.juli.SimpleFormatter.format

因为我在其他 StackOverflow 线程上找到了一些关于此的信息,但它们都没有显示任何效果。日志输出格式保持不变,始终为完整格式。格式字符串没有任何影响。

感谢任何想法, 汤博

【问题讨论】:

  • 您使用的是哪个版本的 apache Tomcat,您将 per-webapp logging.properties 文件放在哪里?
  • 我使用的是 Tomcat 8.5.15,每个 webapp 的 logging.properties 位于 WEB-INF/classes/logging.properties。 per-webapp 属性显示效果,因为仅当 per-webapp logging.properties 存在时才会创建单独的 per-webapp console.logs。没有它们,一切都将进入 catalina.out。
  • 而且自定义格式不能同时使用:webbapp 和 tomcat 通用日志?您是否尝试过当前版本(例如 9.*)?

标签: tomcat logging


【解决方案1】:

我在 Tomcat 8.5.15 上测试了一些变体,发现在每个 webapp logging.properties 中设置 org.apache.juli.FileHandler.formatter 似乎很重要。

所以这是我的每个 webapp logging.properties 的完整结果:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

org.apache.juli.FileHandler.level = ALL
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = webappX.
org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter

而在原来的全局apache-tomcat/conf/logging.properties中,我只修改了java.util.logging.ConsoleHandler.formatter并添加了格式:

java.util.logging.ConsoleHandler.level = FINE
#java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%5$s %n

如果 webApp 在 per-webapp logging.properties 中指定 org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter,则指定的 SimpleFormatter.format 对 webApp 日志文件有效。它对原始控制台输出也很有效。

【讨论】:

  • 感谢您尝试更正 conf 文件。现在看起来很简单,并且工作正常!然而,ServletContextListener.contextInitialized 例程的 System.out.println 仍会转到全局 catalina.out。似乎每个 webapp 属性之后都会激活。有什么想法吗?
  • 也许您必须在每个 webapp 配置中添加一个 consolhandler。我删除了那个。通常不是所有的东西都到 catalina.out 吗?
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多