【问题标题】:How to write separate log file for each instance of a class?如何为类的每个实例编写单独的日志文件?
【发布时间】:2014-02-17 15:01:02
【问题描述】:

我正在使用 java.util.logging 来记录我的程序,问题是我需要为每个类测试用例实例创建单独的日志文件。例如,我有三个测试用例对象,最后得到三个日志文件,但是:

测试用例 #3 包含测试用例 #3 的日志,测试用例 #2 包含测试用例 2 和 3 的日志,测试用例 #1 包含所有测试用例的日志。

这是我的代码:

public class TestCase {
    TestCase(String tcName){
        this.tcName = tcName;
    }

    Logger log = Logger.getLogger("com.sigmaukraine.trn.autotest.testcase");
    String tcName;
    String scenarioReportDir;
    List<Keyword> kwList = new ArrayList<Keyword>();

public void executeTestCase(){
            //saving log for current test case
            try {
                FileHandler fh;
                String fileName = new StringBuilder(tcName).append(".log").toString();
                // This block configure the logger with handler and formatter
                fh = new FileHandler(scenarioReportDir + fileName);
                log.addHandler(fh);
                SimpleFormatter formatter = new SimpleFormatter();
                fh.setFormatter(formatter);
                log.info("Executing test case: " + tcName);

            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            for(Keyword k : kwList){
                k.executeKeyword();
            }


        }

【问题讨论】:

    标签: java logging java.util.logging filehandler


    【解决方案1】:

    问题出在

    log.addHandler(fh);
    

    它继续添加处理程序。所以行为就像你看到的那样。你应该使用

    fh.close();
    log.removeHandler(fh);
    

    执行测试用例后。

    【讨论】:

    • 谢谢,现在它可以工作了,但是临时 .lck 文件留在了目录中
    • 在移除之前关闭处理程序。
    【解决方案2】:
    <appender name="RootSiftAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
          <discriminator>
             <Key><strong>testname</strong></Key>
             <DefaultValue><strong>testrun</strong></DefaultValue>
          </discriminator>
          <sift>
             <appender name="FILE-${testname}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <File>${testname}.log</File>
                <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                   <FileNamePattern><strong>${testname}.%i.log</strong></FileNamePattern>
                   <MinIndex>1</MinIndex>
                   <MaxIndex>100</MaxIndex>
                </rollingPolicy>
                <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                   <MaxFileSize>10MB</MaxFileSize>
                </triggeringPolicy>
                <layout class="ch.qos.logback.classic.PatternLayout">
                   <Pattern>%d{ISO8601} %-5level %C{1} [%M:%L] [%thread] - %msg%n</Pattern>
                </layout>
             </appender>
          </sift>
       </appender>
    

    【讨论】:

    • OP 询问的是java.util.logging 而不是slf4j-logback
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2015-09-28
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多