应用本身的日志配置与使用相信都很熟悉了。本文主要讨论如何在spring boot环境下配置tomcat内部日志输出……。


一、先说一下tomcat的内部日志机制

为了tomcat容器中的各个应用的日志能独立开来,tomcat并没有直接使用JDK的日志实现,因为JDK的日志是面向整个虚拟机的,无法实现每个类加载器都维护一套自己的logger树(tomcat中的每个web应用都有自己的类加载器)。因此,tomcat对JDK的日志部分实现进行了重写,具体做法是借助了commons logging的代码,更改了它的包名,并且硬编码为日志实现使用JDK的日志(众所周知,commons logging是可以使用各种不同的日志实现的),tomcat将这套重写过的日志库命名为JULI(java util logging implementation的缩写)。

JULI除了实现了各个web应用的日志隔离,还增加了一些新的特性,如在配置日志时,可以从同一个handler定义多个handler实例,具体本文不再细说。

二、配置tomcat内部日志输出的步骤

需要配置一个名为java.util.logging.manager,值为org.apache.juli.ClassLoaderLogManager的虚拟机属性,可以通过命令行上-D参数配置。如果应用是直接运行main方法的,还可以直接在main方法的开头以编程的方式System.setProperty()来配置。

在通过spring-boot:run运行应用时,配置方法有所不同,可以通过配置插件时配置。当然推荐调用maven命令时通过命令行参数,参数名为run.jvmArguments,值为-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager。

编辑logggin.properties日志配置文件。

此配置文件要放到类路径根上。

示例配置:

------------------------------------

#构造日志handler实例,此处仅构造了一个异步文件处理器,以将日志输出到文件
handlers = org.apache.juli.AsyncFileHandler

#配置上面构造的handler实例,注意引用实例时是通过全限制类名引用的,而且在配置日志位于的目录时使用了相对路径表示位于当前工作目录下面,日志文件的前缀可根据喜好调整

org.apache.juli.AsyncFileHandler.directory = logs
org.apache.juli.AsyncFileHandler.prefix = tomcat.
#绑定上面配置的处理器实例到根日志记录器,以便默认所有日志都输出到文件

.handlers = org.apache.juli.AsyncFileHandler

------------------------------------

针对上面配置的提示:

org.apache.juli.AsyncFileHandler.level = debug,这种配置极易误导初学者,此处对处理器配置debug输出,仅仅是起到一个过滤作用,并不能决定日志是否真的能够输出到debug级别,决定日志是否输出的是logger的level属性。

配置根logger的输出级别为trace的示例:.level=trace

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐