模块 java.logging

类 LogManager

java.lang.Object
java.util.logging.LogManager

public class LogManager extends Object
有一个全局 LogManager 对象用于维护一组有关 Logger 和日志服务的共享状态。

这个 LogManager 对象:

  • 管理 Logger 对象的分层命名空间。所有命名的记录器都存储在这个命名空间中。
  • 管理一组日志控制属性。这些是简单的键值对,处理程序和其他日志记录对象可以使用它们来配置自己。

可以使用 LogManager.getLogManager() 检索全局 LogManager 对象。 LogManager 对象是在类初始化期间创建的,以后不能更改。

在启动时,LogManager 类使用 java.util.logging.manager 系统属性定位。

日志管理器配置

LogManager 在 LogManager 初始化期间通过 readConfiguration() 方法初始化日志记录配置。默认情况下,使用 LogManager 默认配置。 LogManager读取的日志配置必须是属性文件格式。

LogManager 定义了两个可选的系统属性,允许控制初始配置,如 readConfiguration() 方法中所指定:

  • java.util.logging.config.class
  • java.util.logging.config.file

这两个系统属性可以在命令行上指定给“java”命令,或者作为传递给 JNI_CreateJavaVM 的系统属性定义。

记录器和处理程序的 properties 名称以处理程序或记录器的点分隔名称开头。
全局日志记录属性可能包括:

  • 属性“处理程序”。这定义了一个空白或逗号分隔的类名称列表,供处理程序类加载并注册为根 Logger(名为“”的 Logger)上的处理程序。每个类名必须用于具有默认构造方法的 Handler 类。请注意,这些处理程序可能会在首次使用时延迟创建。
  • 属性“<logger>.handlers”。这定义了一个空白或逗号分隔的类名称列表,供处理程序类加载并注册为指定记录器的处理程序。每个类名必须用于具有默认构造方法的 Handler 类。请注意,这些处理程序可能会在首次使用时延迟创建。
  • 属性“<logger>.handlers.ensureCloseOnReset”。这定义了一个boolean。如果“<logger>.handlers”未定义或为空,则忽略此属性。否则它默认为 true 。当值为 true 时,与记录器关联的处理程序保证在 reset() 上关闭并关闭。这可以通过在配置中明确设置“<logger>.handlers.ensureCloseOnReset=false”来关闭。请注意,关闭此属性会导致引入资源泄漏的风险,因为记录器可能会在调用 reset() 之前收集垃圾,从而防止其处理程序在 reset() 上关闭。在这种情况下,应用程序有责任确保在记录器被垃圾收集之前关闭处理程序。
  • 属性“<logger>.useParentHandlers”。这定义了一个boolean。默认情况下,每个记录器除了自己处理日志消息外,还会调用其父记录器,这通常会导致根记录器也处理消息。将此属性设置为 false 时,需要为此记录器配置一个处理程序,否则不会传递任何日志消息。
  • 属性“配置”。此属性旨在允许运行任意配置代码。该属性定义了一个以空格或逗号分隔的类名列表。将为每个命名类创建一个新实例。每个类的默认构造方法可以执行任意代码来更新日志记录配置,例如设置记录器级别、添加处理程序、添加过滤器等。

请注意,在 LogManager 配置期间加载的所有类首先在系统类路径上搜索,然后再搜索任何用户类路径。这包括 LogManager 类、任何配置类和任何处理程序类。

记录器根据它们的点分隔名称组织成命名层次结构。因此“abc”是“ab”的子级,但“a.b1”和“a.b2”是对等的。

假定名称以“.level”结尾的所有属性都定义了 Logger 的日志级别。因此,“foo.level”为名为“foo”的记录器定义了一个日志级别,并(递归地)为它在命名层次结构中的任何子项定义了一个日志级别。日志级别按照它们在属性文件中定义的顺序应用。因此,树中子节点的级别设置应该在其父节点设置之后。属性名称“.level”可用于设置树根的级别。

LogManager 对象上的所有方法都是多线程安全的。

自从:
1.4
  • 字段详细信息

  • 构造方法详细信息

    • LogManager

      protected LogManager()
      受保护的构造方法。这是受保护的,以便容器应用程序(例如 J2EE 容器)可以子类化该对象。它是非公共的,因为它旨在只有一个 LogManager 对象,其值通过调用 LogManager.getLogManager 检索。
  • 方法详情

    • getLogManager

      public static LogManager  getLogManager()
      返回全局 LogManager 对象。
      返回:
      全局 LogManager 对象
    • addLogger

      public boolean addLogger(Logger  logger)
      添加一个命名记录器。如果已经注册了具有相同名称的记录器,这将不执行任何操作并返回 false。

      Logger 工厂方法调用此方法来注册每个新创建的 Logger。

      应用程序应该保留它自己对 Logger 对象的引用,以避免它被垃圾收集。 LogManager 可能只保留弱引用。

      参数:
      logger - 新的记录器。
      返回:
      如果参数记录器已成功注册,则为 true;如果该名称的记录器已存在,则为 false。
      抛出:
      NullPointerException - 如果记录器名称为空。
    • getLogger

      public Logger  getLogger(String  name)
      查找命名记录器的方法。

      请注意,由于不受信任的代码可能会创建具有任意名称的记录器,因此不应依赖此方法来查找安全敏感日志记录的记录器。同样重要的是要注意,如果没有对 Logger 的强引用,与 String name 关联的 Logger 可能随时被垃圾回收。此方法的调用者必须检查返回值是否为空,以便正确处理 Logger 已被垃圾回收的情况。

      参数:
      name - 记录器的名称
      返回:
      匹配记录器,如果未找到则为 null
    • getLoggerNames

      public Enumeration <String > getLoggerNames()
      获取已知记录器名称的枚举。

      注意:记录器可以在加载新类时动态添加。此方法仅报告当前注册的记录器。还需要注意的是,此方法仅返回 Logger 的名称,而不是对 Logger 本身的强引用。返回的 String 不会阻止 Logger 被垃圾回收。特别是,如果将返回的名称传递给 LogManager.getLogger() ,则调用者必须检查 LogManager.getLogger() 的返回值是否为空,以正确处理自此方法返回其名称以来 Logger 已被垃圾回收的情况。

      返回:
      记录器名称字符串的枚举
    • readConfiguration

      public void readConfiguration() throws IOException , SecurityException
      读取并初始化日志记录配置。

      如果设置了“java.util.logging.config.class”系统属性,则该属性值被视为类名。将加载给定的类,实例化一个对象,该对象的构造函数负责读取初始配置。 (该对象可以使用其他系统属性来控制其配置。)备用配置类可以使用 readConfiguration(InputStream) 来定义 LogManager 中的属性。

      如果“java.util.logging.config.class”系统属性是not设置,则此方法将从属性文件中读取初始配置并调用 readConfiguration(InputStream) 方法来初始化配置。 “java.util.logging.config.file”系统属性可用于指定将作为初始配置读取的属性文件;如果未设置,则使用 LogManager 默认配置。默认配置通常从 Java 安装目录中的属性文件“conf/logging.properties”加载。

      读取属性后将调用任何 注册配置监听器

      API 注意:
      readConfiguration 方法应仅用于在 LogManager 初始化期间初始化配置或与“java.util.logging.config.class”属性一起使用。如果在创建记录器后调用此方法,并且未设置“java.util.logging.config.class”系统属性,则所有现有记录器都将为 reset 。然后,在新配置流中具有指定级别属性的任何现有记录器都将set到指定的日志级别。

      要正确更新日志记录配置,请改用 updateConfiguration(java.util.function.Function) updateConfiguration(java.io.InputStream, java.util.function.Function) 方法。

      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
      IOException - 如果读取配置时出现 IO 问题。
    • reset

      public void reset() throws SecurityException
      重置日志记录配置。

      对于所有命名记录器,重置操作会删除并关闭所有处理程序,并且(根记录器除外)将级别设置为 null 。根记录器的级别设置为 Level.INFO

      API 注意:
      调用此方法还会清除 LogManager propertiesupdateConfiguration(Function) updateConfiguration(InputStream, Function) 方法可用于正确更新到新配置。
      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
    • readConfiguration

      public void readConfiguration(InputStream  ins) throws IOException , SecurityException
      从给定的输入流读取并初始化日志记录配置。

      读取属性后将调用任何 注册配置监听器

      API 注意:
      readConfiguration 方法应仅用于在 LogManager 初始化期间初始化配置或与“java.util.logging.config.class”属性一起使用。在创建记录器后调用此方法时,所有现有记录器都将为 reset 。然后,在给定输入流中具有指定级别属性的任何现有记录器都将set到指定的日志级别。

      要正确更新日志记录配置,请改用 updateConfiguration(java.util.function.Function) updateConfiguration(java.io.InputStream, java.util.function.Function) 方法。

      参数:
      ins - 从中读取属性的流
      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
      IOException - 如果从流中读取有问题,或者给定的流不是 属性文件 格式。
    • updateConfiguration

      public void updateConfiguration(Function <String ,BiFunction <String ,String ,String >> mapper) throws IOException
      更新日志记录配置。

      如果设置了“java.util.logging.config.file”系统属性,则属性值指定要作为新配置读取的属性文件。否则,将使用 LogManager 默认配置。
      默认配置通常从 Java 安装目录中的属性文件“conf/logging.properties”加载。

      此方法读取新配置并调用 updateConfiguration(ins, mapper) 方法更新配置。

      API 注意:
      此方法通过读取属性文件更新日志记录配置并忽略“java.util.logging.config.class”系统属性。 “java.util.logging.config.class”属性仅由 readConfiguration() 方法用于加载自定义配置类作为初始配置。
      参数:
      mapper - 采用配置密钥的功能接口k并返回一个函数f(o,n)其返回值将应用于生成的配置。功能f可能会返回 null 以指示该属性k不会添加到生成的配置中。
      如果 mappernull,则假定为 (k) -> ((o, n) -> n)
      对于每个k, 映射函数f将使用关联的值调用k在旧配置中(即o) 和关联的值k在新配置中(即n).
      nullo或者n表示没有值存在k在相应的配置中。
      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control"),或者没有设置配置所需的权限(例如,为 FileHandlers 指定的打开文件等...)
      NullPointerException - 如果 mapper 在调用时返回 null 函数。
      IOException - 如果从日志记录配置文件读取时出现问题。
      自从:
      9
      参见:
    • updateConfiguration

      public void updateConfiguration(InputStream  ins, Function <String ,BiFunction <String ,String ,String >> mapper) throws IOException
      更新日志记录配置。

      对于 现有配置 中的每个配置键和给定的输入流配置,调用给定的 mapper 函数以从配置键映射到一个函数,f(o,n),它采用旧值和新值并返回结果值以应用于结果配置,如下表中指定。

      k是旧配置或新配置中的配置键,o是旧值(即与关联的值k在旧配置中),n是新值(即与关联的值k在新配置中)和fmapper.apply( 返回的函数k):然后= f(o,n)是结果值。如果v不是 null ,那么一个属性k有值v将被添加到生成的配置中。否则,它将被省略。
      null 值可以传递给函数f表示对应的配置没有配置keyk.功能f可能会返回 null 以指示将没有关联的值k在生成的配置中。

      如果 mappernull ,那么v将被设置为n.

      LogManager properties 在生成的配置中使用生成的值进行更新。

      已注册的配置监听器将在配置更新成功后被调用。

      更新配置属性
      属性 结果行为
      <logger>.level
      • 如果生成的配置为记录器定义了一个级别,并且生成的级别与旧配置中指定的级别不同,或者未在旧配置中指定,则如果记录器存在或该记录器的子项存在,则级别对于那个记录器将被更新,并且更改传播到任何现有的记录器子项。如有必要,这可能会导致创建记录器。
      • 如果旧配置为记录器定义了一个级别,而生成的配置没有,则此更改将不会传播到现有记录器(如果有)。要完全替换配置 - 因此调用者应在调用 updateConfiguration 之前调用 reset 清空当前配置。
      <logger>.useParentHandlers
      • 如果 useParentHandlers 属性的结果值或旧值不为 null,则如果记录器存在或该记录器的子项存在,则该记录器将更新为结果值。 useParentHandlers属性的值为配置中指定的值;如果未指定,则默认为 true。
      <logger>.handlers
      • 如果生成的配置为记录器定义了一个处理程序列表,并且如果生成的列表与旧配置中为该记录器指定的列表(可能为空)不同,则如果记录器存在或其子项存在,则处理程序与该记录器关联的将被关闭和删除,并且将根据生成的配置创建新的处理程序并将其添加到该记录器,必要时创建该记录器。
      • 如果旧配置为记录器定义了一些处理程序,而生成的配置没有,如果该记录器存在,它的处理程序将被删除并关闭。
      • 更改现有记录器上的处理程序列表将导致其所有以前的处理程序被删除和关闭,无论它们是从配置中创建的还是以编程方式创建的。如果有的话,旧的处理程序将被新的处理程序替换。
      <handler-name>.*
      • 在处理程序类上配置/更改的属性只会影响新创建的处理程序。如果节点在旧配置和结果配置中配置了相同的处理程序列表,那么这些处理程序将保持不变。
      config 和任何其他财产
      • 这些属性的结果值将存储在 LogManager 属性中,但updateConfiguration 不会解析或处理它们的值。

      Example mapper functions:

      • 用新配置替换所有日志记录属性:

        (k) -> ((o, n) -> n) :

        这相当于传递一个空的 mapper 参数。
      • 合并新配置和旧配置并使用新值,如果k存在于新配置中:

        (k) -> ((o, n) -> n == null ? o : n) :

        就像按如下方式合并两个集合:result.putAll(oldc); result.putAll(newc)
      • 合并新配置和旧配置,如果有则使用旧值k存在于旧配置中:

        (k) -> ((o, n) -> o == null ? n : o) :

        就像按如下方式合并两个集合:result.putAll(newc); result.putAll(oldc)
      • 将除 handler 属性之外的所有属性替换为新配置,以配置 Logger 的非根记录器的处理程序:
        (k) -> k.endsWith(".handlers") 
             ? ((o, n) -> (o == null ? n : o)) 
             : ((o, n) -> n) 

      要完全重新初始化配置,应用程序可以首先调用 reset 以完全删除旧配置,然后调用 updateConfiguration 以初始化新配置。

      参数:
      ins - 从中读取属性的流
      mapper - 采用配置密钥的功能接口k并返回一个函数f(o,n)其返回值将应用于生成的配置。功能f可能会返回 null 以指示该属性k不会添加到生成的配置中。
      如果 mappernull,则假定为 (k) -> ((o, n) -> n)
      对于每个k, 映射函数f将使用关联的值调用k在旧配置中(即o) 和关联的值k在新配置中(即n).
      nullo或者n表示没有值存在k在相应的配置中。
      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control"),或者没有设置配置所需的权限(例如,打开为 FileHandlers 指定的文件)
      NullPointerException - 如果 ins 为空,或者如果 mapper 在调用时返回空函数。
      IOException - 如果从流中读取有问题,或者给定的流不是 属性文件 格式。
      自从:
      9
    • getProperty

      public String  getProperty(String  name)
      获取日志记录属性的值。如果未找到该属性,该方法将返回 null。
      参数:
      name - 属性名称
      返回:
      适当的值
    • checkAccess

      @Deprecated (since ="17", forRemoval =true) public void checkAccess() throws SecurityException
      已弃用,将被删除:此 API 元素可能会在未来版本中删除。
      此方法仅与 安全管理器 结合使用,后者已弃用并会在未来版本中删除。因此,此方法也已弃用并可能被删除。安全管理器或此方法没有替代品。
      检查当前上下文是否可信以修改日志记录配置。这需要 LoggingPermission("control")。

      如果检查失败,我们抛出一个 SecurityException,否则我们正常返回。

      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
    • getLoggingMXBean

      @Deprecated (since ="9") public static LoggingMXBean  getLoggingMXBean()
      已弃用。
      java.util.logging.LoggingMXBean 已弃用并替换为 java.lang.management.PlatformLoggingMXBean 。请改用 ManagementFactory.getPlatformMXBean (PlatformLoggingMXBean.class)。
      返回 LoggingMXBean 用于管理记录器。
      返回:
      一个 LoggingMXBean 对象。
      自从:
      1.5
      参见:
    • addConfigurationListener

      public LogManager  addConfigurationListener(Runnable  listener)
      添加一个配置监听,每次读取日志配置时都会调用它。如果监听已经注册,则该方法不执行任何操作。

      使用受此方法的调用上下文限制的特权调用监听。未指定调用监听的顺序。

      建议监听器不要抛出错误或异常。如果监听器因未捕获的错误或异常而终止,则在调用所有监听器后,第一个异常将传播到 readConfiguration() (或 readConfiguration(java.io.InputStream) )的调用者。

      实现注意事项:
      如果多个监听器因未捕获的错误或异常而终止,则实现可能会将其他错误或异常记录为 被抑制的异常
      参数:
      listener - 配置更改后将调用的配置监听器。
      返回:
      这个日志管理器。
      抛出:
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
      NullPointerException - 如果监听器为空。
      自从:
      9
    • removeConfigurationListener

      public void removeConfigurationListener(Runnable  listener)
      删除以前注册的配置监听。如果未找到监听,则静默返回。
      参数:
      listener - 要删除的配置监听器。
      抛出:
      NullPointerException - 如果监听器为空。
      SecurityException - 如果存在安全管理器并且调用者没有 LoggingPermission("control")。
      自从:
      9