我正在尝试在我的
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>
如果您想有条件地记录到不同的附加程序或不同的位置(取决于环境),您可以添加
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>
log4j2配置不支持条件逻辑。
但是,您可以实现拥有不同路径的目标,例如通过使用文件名的系统属性来区分不同的操作系统。 该文档解释了如何执行此操作并提供了一些示例: http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution
您可以在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\"));"
以防万一有人发现这个问题,在 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>
但请注意,通常有更好的替代方案,例如此处其他答案中提到的系统属性和环境变量。