Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个请求在一个文件中记录不同的日志框架_Java_Hadoop_Logging_Log4j_Slf4j - Fatal编程技术网

Java 每个请求在一个文件中记录不同的日志框架

Java 每个请求在一个文件中记录不同的日志框架,java,hadoop,logging,log4j,slf4j,Java,Hadoop,Logging,Log4j,Slf4j,我有一个JavaJAXRSWeb服务器,它有很多类。每个类使用不同的日志框架。其中大多数使用slf4j,一些使用org.apache.commons.logging。此外,我在使用log4j进行日志记录的程序中使用了hadoop 1.2.0 我希望每个请求有不同的日志文件(每个请求运行的线程),服务器有不同的日志文件。 为此,我使用了MDC和siftingappender,但只有slf4j日志文件是用线程日志编写的。hadoop日志写入不同的日志文件,apache.commons.logging

我有一个JavaJAXRSWeb服务器,它有很多类。每个类使用不同的日志框架。其中大多数使用slf4j,一些使用org.apache.commons.logging。此外,我在使用log4j进行日志记录的程序中使用了hadoop 1.2.0

我希望每个请求有不同的日志文件(每个请求运行的线程),服务器有不同的日志文件。 为此,我使用了MDC和siftingappender,但只有slf4j日志文件是用线程日志编写的。hadoop日志写入不同的日志文件,apache.commons.logging日志写入服务器日志文件。 如何将每个请求的日志保存在一个文件中

请考虑,由于大量的类,我不想将所有日志文件都更改为Log4J。此外,我不能更改hadoop日志框架,因为它是一个jar文件

有人能帮我吗?
(如果我的英语不好,我很抱歉。)

我找到了使用slf4j集成所有日志框架的解决方案。我将log4j-over-slf4j.jar和jcl-over-slf4j.jar添加到我的库中。因此,log4j和org.apache.commons.logging使用slf4j配置来根据日志记录

但这还不重要,我还有一个问题!Hadoop作业日志未写入其请求线程日志文件。事实上,我的新问题是:“Hadoop作业没有固有的MDC日志值!”。我通过为每个新请求创建新的logback.xml来解决它,并使用joranconfig.doConfigure()将其设置为新的配置文件

这是我的logback.xml


你有什么类型的项目?它是一个web应用程序吗?它是一个restful web服务器。
<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender">

    <!-- This is MDC value -->
    <!-- We will assign a value to 'logFileName' via Java code -->
    <discriminator>
        <key>logFileName</key>
        <defaultValue>server</defaultValue>
    </discriminator>

    <sift>

      <!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime  -->
      <appender name="FILE-${logFileName}"
        class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/${logFileName}.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{ISO8601} %level %X{logName} : %logger{30} - %msg%n
            </Pattern>
        </encoder>

      </appender>

    </sift>
</appender>

<root level="info">
    <appender-ref ref="FILE" />
</root>
    // assume SLF4J is bound to logback in the current environment
    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

    try {
      JoranConfigurator configurator = new JoranConfigurator();
      configurator.setContext(context);
      // Call context.reset() to clear any previous configuration, e.g. default 
      // configuration. For multi-step configuration, omit calling context.reset().
      context.reset(); 
      configurator.doConfigure(newPath+"/logback.xml");
    } catch (JoranException je) {
      // StatusPrinter will handle this
    }
    StatusPrinter.printInCaseOfErrorsOrWarnings(context);