1

我正在使用弹簧。当请求来自控制器时,我会创建多个线程并在这些线程中记录内容。但是,第二个线程的内容记录了 2 次,第三个线程记录了 3 次,依此类推。

如果线程是async.

此外,在停止 Tomcat 之前,我无法删除日志文件。

下面是我的代码:

LogUtil.java

public class LogUtil {


    public static Marker getMarker() {
        Marker marker = MarkerFactory.getMarker("Finalize");
        marker.add(ClassicConstants.FINALIZE_SESSION_MARKER);
        return marker;
    }

    public static void addSiftingAppender(org.slf4j.Logger log) {

        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

        Logger logger = lc.getLogger(log.getName());

        SiftingAppender sa = new SiftingAppender();
        sa.setName("SIFT");
        sa.setContext(lc);

        MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator();
        discriminator.setKey("logFileName");
        discriminator.setDefaultValue("batch0");
        discriminator.start();

        sa.setDiscriminator(discriminator);

        sa.setAppenderFactory(new AppenderFactory<ILoggingEvent>() {

            @Override
            public Appender<ILoggingEvent> buildAppender(Context context,
                    String discriminatingValue) throws JoranException {
                FileAppender<ILoggingEvent> appender = new FileAppender<ILoggingEvent>();
                appender.setName("BATCH-EXECUTION-" + discriminatingValue);
                appender.setContext(context);
                appender.setFile(discriminatingValue + ".log");
                appender.setAppend(true);
                if (appender.isStarted()) {
                    appender.stop();
                }

                PatternLayoutEncoder pl = new PatternLayoutEncoder();
                pl.setContext(context);
                pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
                pl.setImmediateFlush(true);
                if (pl.isStarted()) {
                    pl.stop();
                }
                pl.start();
                appender.setEncoder(pl);

                appender.start();
                return appender;
            }
        });
        if (sa.isStarted()) {
            sa.stop();
        }
        sa.start();
        logger.addAppender(sa);
    }

}

头.java

public class Head implements Runnable {

    // static Logger logger = LoggerFactory.getLogger(Head.class);

    private Logger log;

    private String name;

    Head(Logger logger, String name) {
        this.log = logger;
        this.name = name;
    }

    @Override
    public void run() {
        LogUtil.addSiftingAppender(log);
        MDC.put("logFileName", getName());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        log.info("something" + getName());
        log.info(LogUtil.getMarker(), "ended");
        MDC.remove("logFileName");

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setLogger(Logger log) {
        this.log = log;
    }

}

IfxDesignerController

@Slf4j
public class IfxDesignerController{

 @RequestMapping(value = "/testsomething", method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String
            testsomething()
                    throws IllegalStateException, IOException {

        ExecutorService executor = Executors.newCachedThreadPool();

        int count2 = 1;
        while (count2 <= 2) {
            Head head = new Head(log, "somename" + count2);
            head.setName("head-nested" + count2);
            head.setLogger(log);
            executor.execute(head);
            count2++;
        }
        return null;
    }

}

我发出GET请求时生成的日志文件testsomething如下:

head-nested1.log

10:15:50.869 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested1
10:15:50.869 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested1
10:15:50.887 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended
10:15:50.887 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended

head-nested2.log

10:15:50.955 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested2
10:15:50.955 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested2
10:15:50.957 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended
10:15:50.957 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended

我应该在 logback 配置中进行哪些更改,以便输出如下(期望输出):

head-nested1.log

10:15:50.869 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested1
10:15:50.887 [pool-217-thread-1] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended

head-nested2.log

10:15:50.955 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - somethinghead-nested2
10:15:50.957 [pool-217-thread-2] INFO  c.w.c.h.c.c.i.d.IfxDesignerController - ended

另外,我应该能够在线程执行后删除日志文件

4

0 回答 0