Wildfly/Slf4j 集成问题
Wildfly/Slf4j integration issues
我正在尝试将 SLF4J 集成到一个 struts 应用程序中,该应用程序构建在多个层中:
公共模块,
网络模块,
服务模块等...
每个模块都在使用名为 TraceurProxy 的日志记录 class,定义如下:
public class TraceurProxy {
private Logger logger;
public TraceurProxy(@SuppressWarnings("rawtypes") Class classe) {
this.logger = LoggerFactory.getLogger(classe);
}
public boolean isDebugActive() {
return this.logger.isDebugEnabled();
}
public boolean isInfoActive() {
return this.logger.isInfoEnabled();
}
public boolean isWarnActive() {
return this.logger.isWarnEnabled();
}
public boolean isErrorActive() {
return this.logger.isErrorEnabled();
}
// public boolean isFatalActive() {
// return this.logger.isFatalEnabled();
// }
public void debug(Object object) {
this.logger.debug(object.toString());
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void debug(Object object, Throwable throwable) {
this.logger.debug(object.toString(), throwable);
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void info(Object object) {
this.logger.info(object.toString());
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void info(Object object, Throwable throwable) {
this.logger.info(object.toString(), throwable);
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
}
此 class 在应用程序 [每个模块] 中随处调用以管理日志。
我现在面临的问题是我希望将日志从应用程序外部化以用于生产部署目的。我通过定义以下文件使用 logBack 方法作为 SLF4J 标准的实现:
logback.xml
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<property name="LOG_PATH" value="C:/logs"/>
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
<timestamp key="timestamp-by-second" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="rollingFileLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<file>${LOG_PATH}/logfile-${timestamp-by-second}.log</file>
<fileNamePattern>${LOG_ARCHIVE}/rollingfile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>3MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger level="ALL" name="*.*.*">
<appender-ref ref="rollingFileAppender" />
</logger>
<logger level="ALL" name="*.*.*">
<appender-ref ref="rollingFileAppender" />
</logger>
<root level="ALL">
<appender-ref ref="rollingFileLogger"/>
</root>
</configuration>
出于维护目的,我将此配置文件放在项目 class 路径之外,并且我使用以下 属性 作为 eclipse 中的 VM 参数来通知 Wildfly关于配置文件位置-Dlogback.configurationFile=C:/logs/Logback.xml,但启动后阶段,在调用 HTTP 请求后我什么也没发现,没有创建文件,也没有附加日志。就像 Wildfly 完全忽略了我的配置,只记录 server.log.
这是我的依赖项:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
正如我之前所说,我的应用程序架构包含许多项目,我将依赖项和 TraceurProxy 定义放在 common-module 因为它被所有前端模块使用,例如 web 模块。
提前感谢任何解决方案,我被阻止了。
我通过以下操作解决了这个问题。
我创建了 jboss-deployment-structure.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<sub-deployment name="pfi-web.war">
<exclusions>
<module name="org.apache.commons.logging" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.logmanager.log4j" />
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
</exclusions>
</sub-deployment>
</jboss-deployment-structure>
我不得不把它放在 EAR/META-INF 文件夹下。
我正在尝试将 SLF4J 集成到一个 struts 应用程序中,该应用程序构建在多个层中:
公共模块, 网络模块, 服务模块等...
每个模块都在使用名为 TraceurProxy 的日志记录 class,定义如下:
public class TraceurProxy {
private Logger logger;
public TraceurProxy(@SuppressWarnings("rawtypes") Class classe) {
this.logger = LoggerFactory.getLogger(classe);
}
public boolean isDebugActive() {
return this.logger.isDebugEnabled();
}
public boolean isInfoActive() {
return this.logger.isInfoEnabled();
}
public boolean isWarnActive() {
return this.logger.isWarnEnabled();
}
public boolean isErrorActive() {
return this.logger.isErrorEnabled();
}
// public boolean isFatalActive() {
// return this.logger.isFatalEnabled();
// }
public void debug(Object object) {
this.logger.debug(object.toString());
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void debug(Object object, Throwable throwable) {
this.logger.debug(object.toString(), throwable);
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void info(Object object) {
this.logger.info(object.toString());
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
public void info(Object object, Throwable throwable) {
this.logger.info(object.toString(), throwable);
TraceurHelper.defineCurrentEventCode(InformationHelper.EXTERNAL_TRACEUR_CODE);
TraceurHelper.defineCurrentTempsEcoule("");
}
}
此 class 在应用程序 [每个模块] 中随处调用以管理日志。
我现在面临的问题是我希望将日志从应用程序外部化以用于生产部署目的。我通过定义以下文件使用 logBack 方法作为 SLF4J 标准的实现:
logback.xml
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<property name="LOG_PATH" value="C:/logs"/>
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
<timestamp key="timestamp-by-second" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="rollingFileLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<file>${LOG_PATH}/logfile-${timestamp-by-second}.log</file>
<fileNamePattern>${LOG_ARCHIVE}/rollingfile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>3MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger level="ALL" name="*.*.*">
<appender-ref ref="rollingFileAppender" />
</logger>
<logger level="ALL" name="*.*.*">
<appender-ref ref="rollingFileAppender" />
</logger>
<root level="ALL">
<appender-ref ref="rollingFileLogger"/>
</root>
</configuration>
出于维护目的,我将此配置文件放在项目 class 路径之外,并且我使用以下 属性 作为 eclipse 中的 VM 参数来通知 Wildfly关于配置文件位置-Dlogback.configurationFile=C:/logs/Logback.xml,但启动后阶段,在调用 HTTP 请求后我什么也没发现,没有创建文件,也没有附加日志。就像 Wildfly 完全忽略了我的配置,只记录 server.log.
这是我的依赖项:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
正如我之前所说,我的应用程序架构包含许多项目,我将依赖项和 TraceurProxy 定义放在 common-module 因为它被所有前端模块使用,例如 web 模块。
提前感谢任何解决方案,我被阻止了。
我通过以下操作解决了这个问题。
我创建了 jboss-deployment-structure.xml 如下
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <sub-deployment name="pfi-web.war"> <exclusions> <module name="org.apache.commons.logging" /> <module name="org.apache.log4j" /> <module name="org.jboss.logging" /> <module name="org.jboss.logging.jul-to-slf4j-stub" /> <module name="org.jboss.logmanager" /> <module name="org.jboss.logmanager.log4j" /> <module name="org.slf4j" /> <module name="org.slf4j.impl" /> </exclusions> </sub-deployment> </jboss-deployment-structure>
我不得不把它放在 EAR/META-INF 文件夹下。