2

我跟着这个教程

我有这段代码,但没有写入日志文件。

我错过了什么?

这是我的代码https ://github.com/elad2109/log4j_sift/blob/master/src/main/java/com/waze/rr_logger/SiftExampleLog4j.java

    import org.apache.log4j.Logger;
    import org.slf4j.LoggerFactory;


public class SiftExampleLog4j {

    static org.apache.log4j.Logger logger = Logger.getLogger(SiftExampleLog4j.class);

    public void log() {
        BasicConfigurator.configure();

        org.apache.log4j.MDC.put("session_id","MyGooApp");

        logger.error("example1");

        org.apache.log4j.MDC.put("session_id","MyFooApp");

        logger.error("example2");
    }
}

log4j.properties

    log4j.rootLogger=INFO, sift, osgi:VmLogAppender

# Sift appender
log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.sift.key=session_id
log4j.appender.sift.default=no_session_id
log4j.appender.sift.appender=org.apache.log4j.FileAppender
log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
log4j.appender.sift.appender.file=$\\{session_id\\}.log
log4j.appender.sift.appender.append=true

我希望看到 2 个输出日志文件:MyGooApp.logMyFooApp.log. 但是我在任何地方都找不到它们。

更新

我试过这个:

log4j.appender.sift.appender.file=./$\\{session_id\\}.log

但我现在看到输出文件:

在此处输入图像描述

4

3 回答 3

1

这里有多个问题。

  1. 首先将您的 log4j.properties 从项目的根目录移动到“ src/resources”。然后你会看到一个相关错误的世界。

  2. Log4j jar 没有这个包org.apache.log4j.sift,添加支持 pax-logging jar 到你的类路径。

  3. 使用 Karaf OSGi MDC 或 Camel MDC 也将有所帮助,因为 Apache Karaf 使用 Pax Logging 作为日志系统。(虽然我不确定没有 OSGi 它将如何工作)

您的问题不在于这一行log4j.appender.sift.appender.file=./$\\{session_id\\}.log,就路径而言./$\\{session_id\\}.log,一旦您正确配置了其他所有内容,就应该在项目根目录中创建日志文件。

于 2016-05-14T09:23:49.703 回答
1

我已经使用 logback 完成了它。我现在和你分享。

SiftExample.java

package chapters.appenders.sift;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;

public class SiftExample {
    public static void main(String[] args) throws JoranException {
        String configFile = "F://logbackfile/logback.xml";

        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();

        Logger logger = LoggerFactory.getLogger(SiftExample.class);
        logger.debug("Application started");

        lc.reset();
        lc.putProperty("appname", "MyGooApp");
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
        logger.debug("Alice says hello");

        lc.reset();
        lc.putProperty("appname", "MyFooApp");
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
        logger.debug("Bob says hi");
    }

    static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SiftExample.class.getName() + " configFile\n" + "   configFile a logback configuration file");
        System.exit(1);
    }
}

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="DEV_HOME" value="F://logbackfile" />
    <appender name="FILE-AUDIT"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV_HOME}/${appname}.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
                        </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="chapters.appenders.sift" level="debug"
        additivity="false">
        <appender-ref ref="FILE-AUDIT" />
    </logger>
    <root level="error">
        <appender-ref ref="FILE-AUDIT" />
    </root>
</configuration>

输出:

MyGooApp.log

2016-05-09 01:35:57 - Alice says hello

MyFooApp.log

2016-05-09 01:35:57 - Bob says hi

注意:请不要忘记这样做

  1. 包名称chapters.appenders.siftlogback.xml中添加为<logger name="chapters.appenders.sift" level="debug" ...
于 2016-05-08T19:51:42.873 回答
1

似乎您正在使用相对路径作为文件名(log4j.appender.sift.appender.file=$\\{session_id\\}.log)。

如果您将 log4j 的日志级别设置为调试,您应该在生成的日志中看到如下语句:

setFile called: "+fileName+"

您可以通过定义 log4j.configDebug 变量来启用 log4j 内部日志记录。所有 log4j 内部调试调用都转到 System.out,其中内部错误消息被发送到 System.err。所有内部消息都以字符串“log4j:”开头。

作为测试,您还可以将文件属性更改为:

log4j.appender.sift.appender.file=./$\\{session_id\\}.log

.表示当前文件夹(通常是项目根文件夹)。

于 2016-05-09T06:35:42.987 回答