log4j2使用手册(中文)第八章 Lookups

Lookups提供了一种在Log4j配置文件任意位置添加值的方法。 它们是实现StrLookup接口的特定类型的插件。 有关如何在配置文件中使用Lookup的信息,请参Configuration页面的“属性替换”部分。

Context Map Lookup

ContextMapLookup允许应用程序将数据存储在Log4j ThreadContext Map中,然后检索Log4j配置中的值。 在下面的示例中,应用程序将使用键“loginId”将当前用户的登录ID存储在ThreadContext Map中。 在初始配置处理期间,第一个’$’将被删除。 PatternLayout支持使用Lookup进行插值,然后为每个事件解析变量。 请注意,模式“%X {loginId}”将获得相同的结果。


  
    %d %p %c{1.} [%t] $${ctx:loginId} %m%n
  

DateLookup

DateLookup与其他查找有些不同,因为它不使用键来定位值。 相反,该键可用于指定对SimpleDateFormat有效的日期格式字符串。当前日期或与当前日志事件关联的日期将按指定格式进行格式化。


  
    %d %p %c{1.} [%t] %m%n
  
  

Docker Lookup

DockerLookup可用于从运行应用程序的Docker容器中查找属性。

Log4j Docker提供对以下容器属性的访问:

containerId 分配给容器的完整ID。
containreName 分配给容器的名称。
imageId 分配给镜像的id。
imageName 分配给镜像的名称。
shortContainerId 容器ID的前12个字符。
shortImageId 镜像ID的前12个字符。

  
  
  

此Lookup受Log4j Docker支持中列出的要求的约束

EnvironmentLookup

EnvironmentLookup允许系统配置环境变量,无论是在/etc/profile之类的全局文件中,还是在应用程序的启动脚本中,然后从日志配置中检索这些变量。下面的示例在应用程序日志中包含当前登录用户的名称。


  
    %d %p %c{1.} [%t] $${env:USER} %m%n
  

此lookup还支持默认值。 在下面的示例中,当USER环境变量未定义时,使用默认值jdoe:


  
    %d %p %c{1.} [%t] $${env:USER:-jdoe} %m%n
  

Java Lookup

JavaLookup允许使用java:前缀在方便的预格式化字符串中检索Java环境信息。

描述
version 简短的Java版本,如:Java version 1.7.0_67
runtime Java运行时版本,如:Java(TM) SE Runtime Environment(build 1.7.0_67-b01) from Oracle Corporation
vm Java VM版本,如:Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
os 操作系统版本,如:Windows 7 6.1 Service Pack 1,architecture: amd64-64
locale 硬件信息,如:default locale: en_US, platform encoding: Cp1252
hw 硬件信息,如:processors: 4, architecture: amd64-64, instruction sets: amd64

例如:


  
    %d %m%n
  

JndiLookup

JndiLookup允许通过JNDI检索变量。 默认情况下,密钥将以java:comp/env/为前缀,但如果密钥包含“:”,则不会添加前缀。


  
    %d %p %c{1.} [%t] $${jndi:logging/context-name} %m%n
  

Java的JNDI模块在Android上不可用。

JVM输入参数 Lookup(JMX)

映射JVM输入参数 - 但不是主参数 - 使用JMX获取JVM参数。 使用前缀jvmrunargs来访问JVM参数。 有关java.lang.management.RuntimeMXBean.getInputArguments()的信息,请参阅Javadocs。 Java的JMX模块在Android或Google App Engine上不可用。

Log4j配置Location Lookup

Log4j配置属性。 表达式 {log4j:configParentLocation}分别提供log4j配置文件及其父文件夹的绝对路径。 以下示例使用此Lookup将日志文件放在相对于log4j配置文件的目录中。


  
    %d %p %c{1.} [%t] %m%n
  

Main Arguments Lookup (Application)

此Lookup要求您手动将应用程序的主要参数提供给Log4j:

import org.apache.logging.log4j.core.lookup.MainMapLookup;
 
public static void main(String args[]) {
  MainMapLookup.setMainArguments(args);
  ...
}

如果已设置主参数,则此lookup允许应用程序从日志记录配置中检索这些主参数值。 main:前缀后面的键可以是参数列表中从0开始索引,也可以是字符串,其中$ {main:myString}替换为主参数列表中myString后面的值。
例如,假设static void main String []参数是:

--file foo.txt --verbose -x bar

然后可以进行以下替换:

表达式 结果
${main:0} –file
${main:1} foo.txt
${main:2} –verbose
${main:3} -x
${main:4} bar
${main:–file} foo.txt
${main:-x} bar
${main:bar} null

用法示例:


  
    %d %m%n
  

Map Lookup

MapLookup有多种用途。

  1. 为配置文件中Properties声明的属性提供基础。
  2. 从LogEvents中的MapMessages中检索值。
  3. 检索使用MapLookup.setMainArguments(String [])设置的值。

第一项仅表示MapLookup用于替换配置文件中定义的属性。 指定这些变量时没有前缀 - 例如$ {name}等。第二种用法允许替换当前MapMessage中的值(如果其中一个是当前日志事件的一部分)。在下面的示例中,RoutingAppender将为MapMessage中名为“type”的键的每个惟一值使用不同的RollingFileAppender。注意,当以这种方式使用时,“type”的值应该在properties声明中声明,以便在消息不是MapMessage或MapMessage不包含键的情况下提供默认值。有关如何设置默认值的信息,请参阅 Configuration 页面的属性替换部分。


  
    
      
        
          %d %p %c{1.} [%t] %m%n
        
        
      
    
  

Marker Lookup

markerlookup允许您在有趣的配置中使用标记,如路由追加器。 请考虑以下YAML配置和基于标记记录到不同文件的代码:

Configuration:
  status: debug
 
  Appenders:
    Console:
    RandomAccessFile:
      - name: SQL_APPENDER
        fileName: logs/sql.log
        PatternLayout:
          Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
      - name: PAYLOAD_APPENDER
        fileName: logs/payload.log
        PatternLayout:
          Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
      - name: PERFORMANCE_APPENDER
        fileName: logs/performance.log
        PatternLayout:
          Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
 
    Routing:
      name: ROUTING_APPENDER
      Routes:
        pattern: "$${marker:}"
        Route:
        - key: PERFORMANCE
          ref: PERFORMANCE_APPENDER
        - key: PAYLOAD
          ref: PAYLOAD_APPENDER
        - key: SQL
          ref: SQL_APPENDER
 
  Loggers:
    Root:
      level: trace
      AppenderRef:
        - ref: ROUTING_APPENDER
public static final Marker SQL = MarkerFactory.getMarker("SQL");
public static final Marker PAYLOAD = MarkerFactory.getMarker("PAYLOAD");
public static final Marker PERFORMANCE = MarkerFactory.getMarker("PERFORMANCE");
 
final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
 
logger.info(SQL, "Message in Sql.log");
logger.info(PAYLOAD, "Message in Payload.log");
logger.info(PERFORMANCE, "Message in Performance.log");

请注意,配置的关键部分是pattern::“$$ {marker:}”。 这将生成三个日志文件,每个文件都包含特定标记的日志事件。 Log4j将使用SQL标记将日志事件路由到sql.log,将带有PAYLOAD标记的日志事件路由到payload.log,依此类推。

您可以使用符号“$ {marker:name}”和“$$ {marker:name}”来检查是否存在标记,其中name是标记名称。 如果标记存在,则表达式返回名称,否则返回null。

Structured Data Lookup

StructuredDataLookup与MapLookup非常相似,它将从StructuredDataMessages中检索值。 除了Map值之外,它还将返回id的名称部分和类型字段。 下面的示例和MapMessage的示例之间的主要区别在于,“type”是StructuredDataMessage的一个属性,而“type”必须是MapMessage中Map的一个键。


  
    
      
        
          %d %p %c{1.} [%t] %m%n
        
        
      
    
  

System Properties Lookup

由于通过使用系统属性在应用程序内部和外部定义值是很常见的,因此很自然地应该可以通过Lookup来访问它们。 由于系统属性通常在应用程序之外定义,因此通常会看到以下内容:


  

此查找还支持默认值。 在下面的示例中,当未定义logPath系统属性时,将使用缺省值/var/logs:


  

Web Lookup

WebLookup允许应用程序检索与ServletContext关联的变量。 除了能够在ServletContext中检索各种字段之外,WebLookup还支持查找存储为属性的值或配置为初始化参数。 下表列出了可以检索的各种键:

|

描述
attr.name 返回具有指定名称的ServletContext属性
contextPath Web应用程序的上下文路径
effectiveMajorVersion 获取此ServletContext所代表的应用程序所基于的Servlet规范的主要版本
effectiveMinorVersion 获取此ServletContext所代表的应用程序所基于的Servlet规范的次要版本。
initParam.name 返回具有指定名称的ServletContext初始化参数
majorVersion 返回此servlet容器支持的Servlet API的主要版本。
minorVersion 返回此servlet容器支持的Servlet API的次要版本。
rootDir 返回使用值“/”调用getRealPath的结果。
serverInfo 返回运行servlet的servlet容器的名称和版本。
servletContextName 返回部署描述符的display-name元素中定义的Web应用程序的名称

指定的任何其他键名都将首先检查ServletContext属性是否存在该名称,然后检查该名称的初始化参数是否存在。如果找到键,则返回相应的值。


  

  • log4j2使用手册(中文)第一章 介绍
  • log4j2使用手册(中文)第二章 架构
  • log4j2使用手册(中文)第三章 Log4j 1.x 迁移至Log4j 2
  • log4j2使用手册(中文)第四章 API
  • log4j2使用手册(中文)第五章 Configuration
  • log4j2使用手册(中文)第六章 使用
  • log4j2使用手册(中文)第七章 Web Applications and JSPs
  • log4j2使用手册(中文)第八章 Lookups

你可能感兴趣的:(log4j2使用手册(中文)第八章 Lookups)