Spring-XD不读取logback.xml

时间:2015-08-20 19:32:00

标签: java spring logback spring-xd

我正在尝试在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文档,但一无所获。

任何见解都将受到赞赏。

2 个答案:

答案 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=valueSystem.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>