如何为每个登录添加唯一标签 logging.properties

How to add a unique tag to each log in logging.properties

我的标准配置Tomcat 8.5将日志拆分成

我的任务是为每个文件添加唯一标签: CatalinaTag、mngTag、localTag、hostMngTag

我试图在互联网上找到解决方案,但没有成功。

我的 logging.properties 是这样的:

handlers = 1catalina.mypackage.CatalinaConsoleHandler, 2localhost.mypackage.LocalhostConsoleHandler, 3manager.mypackage.ManagerConsoleHandler, 4host-manager.mypackage.LocalhostConsoleHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.mypackage.CatalinaConsoleHandler, java.util.logging.ConsoleHandler

1catalina.mypackage.CatalinaConsoleHandler.directory = /.../logs
1catalina.mypackage.CatalinaConsoleHandler.prefix = catalina.
1catalina.mypackage.CatalinaConsoleHandler.formatter = mypackage.CatalinaFormatter
mypackage.CatalinaFormatter.format = [CatalinaTag %1$tF %1$tT] [%4$-7s] %5$s %n

2localhost.mypackage.LocalhostConsoleHandler.directory = /.../logs
2localhost.mypackage.LocalhostConsoleHandler.prefix = localhost.
2localhost.mypackage.LocalhostConsoleHandler.formatter =mypackage.LocalhostFormatter
mypackage.LocalhostFormatter.format = [localhostTag %1$tF %1$tT] [%4$-7s] %5$s %n

3manager.mypackage.ManagerConsoleHandler.directory = /.../logs
3manager.mypackage.ManagerConsoleHandler.prefix = manager.
3manager.mypackage.ManagerConsoleHandler.formatter =mypackage.ManagerFormatter
mypackage.ManagerFormatter.format = [manager %1$tF %1$tT] [%4$-7s] %5$s %n

4host-manager.mypackage.LocalhostConsoleHandler.directory = /.../logs
4host-manager.mypackage.LocalhostConsoleHandler.prefix = host-manager.
4host-manager.mypackage.LocalhostConsoleHandler.formatter =mypackage.HostManagerFormatter
mypackage.HostManagerFormatter.format = [manager %1$tF %1$tT] [%4$-7s] %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.mypackage.LocalhostConsoleHandler

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

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

这里有一个 *ConsoleHandler 的例子

package mypackage;

import java.util.logging.ConsoleHandler;

public class CatalinaConsoleHandler extends ConsoleHandler {
}

这里是 *Formatter 的例子

package mypackage;

import java.util.logging.SimpleFormatter;

public class CatalinaFormatter extends SimpleFormatter {
}

但到目前为止我还做不到。你知道为什么吗?

感谢您的帮助!

如果您使用的是原始 java.util.logging,您多次使用 subclassing ConsoleHandler(或者更确切地说 FileHandler)和 SimpleFormatter 的方法会是正确的:JUL 只允许每个 HandlerFormatter class 有一个实例。这种方法 工作,但您需要将 mypackage.CatalinaConsoleHandler 和公司添加到 system classloader(参见 Tomcat class装载机)。

然而,有一个更简单的方法:Tomcat 有自己的 JUL 扩展(参见 documentation),它允许您:

  • 为每个处理程序名称添加前缀并创建多个相同的处理程序class。前缀必须以数字开头(例如 1catalina.)。带前缀的属性仅适用于特定的处理程序,而 non-prefixed 属性适用于所有处理程序。
  • 使用 属性 占位符 ${...} 将替换为适当的 Java 系统 属性。还有三个特殊属性(classloader.serverNameclassloader.hostNameclassloader.webappName)分别解析引擎、主机和上下文的名称。

因此您可以使用:

# List of all handler names:
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler
# Handlers attached to the root logger:
.handlers = 1catalina.org.apache.juli.AsyncFileHandler

# These properties apply to all handlers
org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter

# These properties apply only to `1catalina.org.apache.juli.AsyncFileHandler`
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.java.util.logging.SimpleFormatter.format = [CatalinaTag %1$tF %1$tT] [%4$-7s] %5$s %n

# These properties apply only to `2localhost.org.apache.juli.AsyncFileHandler`
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.java.util.logging.SimpleFormatter.format = [LocalhostTag %1$tF %1$tT] [%4$-7s] %5$s %n