log4j2.xml中的xml条件代码

log4j2.xml中的xml条件代码,xml,xslt,log4j2,Xml,Xslt,Log4j2,我试图在我的log4j2.xml文件中创建一个条件语句,但它似乎不接受任何条件格式。我尝试了各种选项,如xslt等,但似乎不起作用。这里的任何帮助都会很好 <?xml version="1.0" encoding="UTF-8"?> <configuration status = "WARN"> <appenders> <if> <conditions> <condition prop

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

<?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>
我的目的是根据操作系统创建单独的日志路径。我发现appender错误是因为没有设置MyRollingLog值。然而,我无法解决的是
CLASS\u NOT\u FOUND
错误和
无效元素

我得到这个代码的以下错误

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>

%d%p%m%n

log4j2配置不支持条件逻辑

但是,通过使用文件名的系统属性,您可以实现为不同的操作系统(例如,不同的操作系统)提供不同路径的目标。 本文档介绍了如何执行此操作,并提供了一些示例:

如果您希望有条件地登录到不同的附加器或不同的位置(取决于环境),您可以使用默认值添加属性。例:

<Properties>
    <Property name="LOG_DIR">${LOG_PATH:-${sys:logging.path:-./log}}</Property>
    <Property name="APPENDER">${default.log.appender:-file}</Property>
</Properties>
如果变量“default.log.appender”不存在,则取值“file”。因此,我们可以通过创建或不创建此变量来“有条件地”选择appender。 然后可以选择appender(从现有的appender中)ex


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

我是这样做的。仅当变量设置为true时才有条件地显示控制台输出。我使用的是YAML配置,但您将了解要点。


雷姆科,我知道你是个log4j2提交人。请将条件逻辑带到log4j2,好吗?让我知道提出功能请求的过程。您可以在log4j邮件列表中提出。如果您有这些配置的详细示例,那么Jira票证可能是一个好主意,因为它允许更好的格式和附件。如果你有一个补丁,你会把它附加到Jira票上。讨论通常发生在邮件列表上。嘿,你能解释一下这个
:-
语法是如何工作的吗?我以前没见过它。偶然发现了答案,这是log4j2的一个特性:是的,这是lo4j语法。我相信它的灵感来自LinuxBash语法。它非常流行,因为spring也在SPel(spring表达式)中使用它。
<Loggers>
    <Logger name="com.example" level="debug" />
    <Root level="INFO">
        <AppenderRef ref="${APPENDER}"/>
    </Root>
</Loggers>
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\"));"