我正在尝试在Spring-XD中运行一个位于以下路径下的作业:
/spring-xd/xd/modules/job/MyJobName (I'll call this path MyJobName below)
我的jar位于MyJobName/lib
下,在其根路径中包含文件logback.xml。不幸的是,Spring-XD似乎完全无视该文件。当我通过我的IDE(IntelliJ)运行作业时,日志记录工作正常,但是当我使用Spring-XD运行它时,它完全忽略了我的SiftingAppender。
这是我的logback.xml文件的样子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%5p %-25logger{25} %m %n</pattern>
</encoder>
</appender>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>publication.run.id</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${publication.run.id}" class="ch.qos.logback.core.FileAppender">
<file>/data/${publication.run.id}/logs/process.log</file>
<append>true</append>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%5p %-25logger{25} %m %n</pattern>
</layout>
</appender>
</sift>
</appender>
<logger name="com.bitwiseor">
<level value="INFO" />
</logger>
<logger name="org.springframework">
<level value="INFO" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="SIFT" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
我想把这个logback.xml文件放在/ spring-xd / xd / config下,或者放在另一个配置文件夹下,但是我尝试的都没有。我试着查看Spring-XD文档,但一无所获。
任何见解都将受到赞赏。
答案 0 :(得分:6)
您必须将Logback 直接放在类路径中。见here:
可以通过编程方式或使用以XML或Groovy格式表示的配置脚本来配置Logback。顺便说一句,现有的log4j用户可以使用我们的PropertiesTranslator Web应用程序将他们的log4j.properties文件转换为logback.xml。
让我们首先讨论尝试配置自身后面的logback的初始化步骤:
Logback尝试在类路径中查找名为logback.groovy的文件。
如果未找到此类文件,则logback会尝试在类路径中查找名为logback-test.xml的文件。
如果找不到这样的文件,它会在类路径中检查文件logback.xml。
如果未找到此类文件,并且正在执行的JVM具有ServiceLoader(JDK 6及更高版本),则将使用ServiceLoader来解析com.qos.logback.classic.spi.Configurator的实现。将使用找到的第一个实现。有关详细信息,请参阅ServiceLoader文档。
如果以上都不成功,则logback会自动使用BasicConfigurator自行配置,这将导致日志输出定向到控制台。
听起来我的配置文件不在类路径中。通常,在大多数框架中,默认情况下,config目录不在类路径中,在很多情况下,它们是类路径中的/config/<files>
,并且在加载它们时必须使用/config/name
指定它们使用ClassLoader
。但是,Logback不会这样做,因此如果要将文件存储在config
目录中,则必须手动加载它们。
基本上,您可以告诉JoranConfigurator
从类路径中的自定义位置加载文件,处理错误等等,以确保您找到了自己的文件。见here for more details.
以下是我加载Logback配置的方法,您可以将其改编为您的系统。在这种情况下,resource
是您的类路径中的路径,无论您决定将logback.xml
文件放在何处。在这种情况下,它可能是/spring-xd/xd/config/logback.xml
。
public class LogbackConfigurator {
private static final Logger LOG =
LoggerFactory.getLogger(LogbackConfigurator.class);
public static boolean configure(String resource) throws JoranException {
final InputStream configInputStream = LogbackConfigurator.class.getResourceAsStream(resource);
final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
// the context was probably already configured by default configuration rules
loggerContext.reset();
if(configInputStream != null) {
try {
configurator.doConfigure(configInputStream);
} catch (JoranException e) {
e.printStackTrace();
}
StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
return true;
} else {
LOG.error("Unable to find logback file: {}", resource);
StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
return false;
}
}
}
通常,此方法将被称为main
中的第一行之一,其中包含:
LogbackConfigurator.configure(path);
一旦运行了这个类,就应该配置你的logback,好像系统能够正常找到配置文件一样。请注意,如果您不想将位置硬编码到系统中,也可以使用-Dproperty=value
和System.getProperties().get(keyname)
动态指定备用文件路径的备用位置。
您还可以配置要在Spring配置中注入的位置,但我个人不建议您在注入发生前通常希望在中配置日志记录,以便注入期间发生任何记录事件,它们将被适当记录。
答案 1 :(得分:4)
似乎 logback 配置存在一些小问题。
尝试将以下配置放入应用程序类路径中;应该解决问题。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%5p %-25logger{25} %m %n</pattern>
</encoder>
</appender>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>publication.run.id</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${publication.run.id}" class="ch.qos.logback.core.FileAppender">
<file>/data/${publication.run.id}/logs/process.log</file>
<append>true</append>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%5p %-25logger{25} %m %n</pattern>
</layout>
</appender>
</sift>
</appender>
<logger name="com.bitwiseor" level="INFO" />
<logger name="org.springframework" level="INFO" />
<root level="INFO">
<appender-ref ref="SIFT" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
注意部分根据logback配置参考进行更改:
<logger name="com.bitwiseor" level="INFO" />
<logger name="org.springframework" level="INFO" />
<root level="INFO">
<appender-ref ref="SIFT" />
<appender-ref ref="CONSOLE" />
</root>