我有三个独立的项目,每个项目都有自己的嵌入式logback.xml文件.这些文件中的每一个都包含用户主目录中的公共日志配置文件:
<include file="${user_home}/loggingConfig.xml"/>
Run Code Online (Sandbox Code Playgroud)
在包含之后,我有这个规范:
<root level="error">
<appender-ref ref="${appender:-console}" />
</root>
Run Code Online (Sandbox Code Playgroud)
这允许用户配置其日志级别和appender,并通过核心日志记录配置文件应用它们.
例如,在〜/ loggingConfig.xml中我有这一行:
<property name="appender" value="file" />
Run Code Online (Sandbox Code Playgroud)
但是喜欢控制台记录的同事却离开了这条线.
问题是我想为每个日志文件使用不同的appender.换句话说,我想根据哪个项目正在读取自定义配置文件来有条件地设置不同的appender.
我意识到我可以配置每个项目来读取不同命名的配置文件,但我想消除混乱并允许共享配置.
JBC*_*BCP 15
对于高级配置,文档有点备用,但我发现您可以使用logback context name作为带有条件日志记录的变量.因此,对于每个项目,我在项目logback.xml文件中定义了一个自定义上下文名称:
<contextName>project1</contextName>
Run Code Online (Sandbox Code Playgroud)
等等...
然后在我的〜/ loggingConfig.xml文件中我可以这样做:
<property name="appender" value="file" />
<!--if condition='property("CONTEXT_NAME").equalsIgnoreCase("project1")'>
<then>
<property name="appender" value="file" />
</then>
</if-->
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project2")'>
<then>
<property name="appender" value="console" />
</then>
</if>
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project3")'>
<then>
<property name="appender" value="file" />
</then>
</if>
Run Code Online (Sandbox Code Playgroud)
这可能有点笨拙,但实际上我使用此解决方案来配置单个appender用于不同项目的属性,同时仍然优雅地回退到没有自己的条件块的项目的默认值.
Tri*_*pel 11
如果这有助于其他任何人,这就是我如何使用可以包含多个appender的属性设置条件logback配置:
<root level="${logback.loglevel}">
<if condition='isDefined("logback.appenders")'>
<then>
<if condition='property("logback.appenders").contains("CONSOLE")'>
<then>
<appender-ref ref="CONSOLE"/>
</then>
</if>
<if condition='property("logback.appenders").contains("FILE")'>
<then>
<appender-ref ref="FILE"/>
</then>
</if>
<if condition='property("logback.appenders").contains("GELF")'>
<then>
<appender-ref ref="GELF"/>
</then>
</if>
</then>
<else>
<appender-ref ref="CONSOLE"/>
</else>
</if>
</root>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18815 次 |
| 最近记录: |