log4j2.xml 中的 xml 条件代码

问题描述 投票:0回答:4

我正在尝试在我的

log4j2.xml
文件中创建条件语句,但它似乎不接受任何条件格式。我尝试了各种选项,例如 xslt 等,但它似乎不起作用。任何帮助都会很棒。

我的目的是根据操作系统创建单独的日志记录路径。我看到附加程序错误是因为尚未设置 MyRollingLog 值。然而,这是我无法解决的

CLASS_NOT_FOUND
错误以及
invalid element

我收到此代码的以下错误...

2014-06-10 17:19:48,771 ERROR Error processing element then: CLASS_NOT_FOUND

2014-06-10 17:19:48,773 ERROR appenders contains an invalid element or attribute "if"

2014-06-10 17:19:48,776 ERROR Unable to locate appender MyRollingLog for logger com.xxx.xyz

这里的任何帮助都会很棒。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status = "WARN">
   <appenders>
    <if>
      <conditions>
          <condition property="isMac">
             <os family="mac" />
          </condition>
        </conditions>
        <then>
                     <RollingFile name="MyRollingLog" fileName='../logs/CheckView.log' 
 filePattern="../logs/$${date:yyyy-MM}/CheckView-%d{MM-dd-yyyy}-%i.log.gz">              
            <PatternLayout>
              <pattern>%d %p %m%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="15 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"></DefaultRolloverStrategy>
         </RollingFile>   
        </then>
    </if>
    <Console name="Console-out" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %m%n"/>
   </Console> 
  </appenders>
  <loggers>
  <logger name="com.xxx.xyz"  level = "TRACE" additivity="false">
   <appender-ref ref="MyRollingLog" />
  </logger>
  <root level = "ERROR">
  <appender-ref ref="Console-out"  />
  </root>
  </loggers>
 </configuration>
xml xslt log4j2
4个回答
10
投票

如果您想有条件地记录到不同的附加程序或不同的位置(取决于环境),您可以添加

Properties
并使用默认值。例如:

<Properties>
    <Property name="LOG_DIR">${LOG_PATH:-${sys:logging.path:-./log}}</Property>
    <Property name="APPENDER">${default.log.appender:-file}</Property>
</Properties>

它创建可以取值的log4j2'LOG_DIR'变量:变量“$LOG_PATH”的第一个,如果它是空的(部分

:-
),那么它会查找系统变量
logging.path
,如果它也是空的,则失败-返回到“./log”。 您可以在
appender
中使用它:

<RollingRandomAccessFile append="true" fileName="${LOG_DIR}/myapp.log" name="file">

如果变量“default.log.appender”不存在,则其值为“file”。所以我们可以通过创建或不创建这个变量来“有条件地”选择appender。 然后您可以选择附加程序(从现有的附加程序中)例如。

<Loggers>
    <Logger name="com.example" level="debug" />
    <Root level="INFO">
        <AppenderRef ref="${APPENDER}"/>
    </Root>
</Loggers>

2
投票

log4j2配置不支持条件逻辑。

但是,您可以实现拥有不同路径的目标,例如通过使用文件名的系统属性来区分不同的操作系统。 该文档解释了如何执行此操作并提供了一些示例: http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution


2
投票

您可以在Log4j2中有条件地添加appender

我是按照以下方式完成的。仅当变量设置为 true 时有条件地显示控制台输出。我正在使用 YAML 配置,但您会明白要点。 https://logging.apache.org/log4j/2.0/manual/configuration.html#Scripts

AsyncLogger:
  - name: SampleLogger
    level: error
    additivity: false
    AppenderRef:
      - ref: RollingError
      - ref: STDOUT
        ScriptFilter:
          onMatch: ACCEPT
          onMisMatch: DENY
          Script:
            name: ConsoleOutputCheck
            language: groovy
            value: "return (\"true\").equalsIgnoreCase(System.getenv(\"ConsoleOutput\"));"

0
投票

以防万一有人发现这个问题,在 2024 年可以使用 arbiters 有条件地应用 XML 配置片段:

<Configuration>
  <Select> <!-- applies the first matching branch -->
    <SystemPropertyArbiter propertyName="os.name" propertyValue="Mac OS X">
      <RollingFile name="MyRollingLog" ... /> 
    </SystemPropertyArbiter>
    <SystemPropertyArbiter propertyName="os.name" propertyValue="Linux">
      <RollingFile name="MyRollingLog" ... /> 
    </SystemPropertyArbiter>
    <DefaultArbiter>
      <!-- unrecognized os -->
      <RollingFile name="MyRollingLog" ... /> 
    </DefaultArbiter>
  </Select>
</Configuration>

但请注意,通常有更好的替代方案,例如此处其他答案中提到的系统属性和环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.