7

我有一个简单的日志记录程序,即:

public class LoggingExample1 {
 public static void main(String args[]) {
try {
  LogManager lm = LogManager.getLogManager();
  Logger logger;
  FileHandler fh = new FileHandler("log_test.txt");

  logger = Logger.getLogger("LoggingExample1");
  lm.addLogger(logger);
  logger.setLevel(Level.INFO);

  fh.setFormatter(new SimpleFormatter());

  logger.addHandler(fh);
  // root logger defaults to SimpleFormatter. We don't want messages
  // logged twice.
  //logger.setUseParentHandlers(false);

  logger.log(Level.INFO, "test 1");
  logger.log(Level.INFO, "test 2");
  logger.log(Level.INFO, "test 3");
  fh.close();
} catch (Exception e) {
  System.out.println("Exception thrown: " + e);
  e.printStackTrace();
}
}
}

我得到这个日志:

Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 1
Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 2
Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 3

但我想删除以下消息:LoggingExample1 main 和 INFO,只保留由代码记录的数据。我能做些什么???

4

4 回答 4

7

这是因为您使用的SimpleFormatter总是记录类名、方法名等。如果您不想要这些信息,您可以编写自己的格式化程序。这是一个简单的格式化程序示例,它只输出日志级别和日志消息:

import java.util.logging.*;

class MyFormatter extends Formatter{

    /* (non-Javadoc)
     * @see java.util.logging.Formatter#format(java.util.logging.LogRecord)
     */
    @Override
    public String format(LogRecord record) {
        StringBuilder sb = new StringBuilder();
        sb.append(record.getLevel()).append(':');
        sb.append(record.getMessage()).append('\n');
        return sb.toString();
    }    
}

在您的文件处理程序中使用此格式化程序:

fh.setFormatter(new MyFormatter());

这将输出:

INFO:test 1
INFO:test 2
INFO:test 3
于 2011-08-01T12:30:03.910 回答
3

使用格式化程序类扩展您的类,如下所示:

public class MyFormatter extends SimpleFormatter{

@Override

public synchronized String format(LogRecord record){

    record.setSourceClassName(MyFormatter.class .getName());
    return String.format(
            " [%1$s] :%2$s\n",
            record.getLevel().getName(), formatMessage(record));

    }
}

然后在您的主类中,将控制台处理程序和文件处理程序格式设置为您的类格式对象。就我而言,它是 consoleHandler.format(new MyFormatter); filehandler.format(新的 Myformatter);

最重要的是你必须设置 logger.setUseParentHandler(false);

现在你可以走了!

于 2016-10-05T12:47:35.533 回答
0

如果我对您的理解正确,您想删除INFO并且只有拥有test 1等等?

如果是这样的话,我认为这是不可能的。原因是您需要知道这是什么类型的消息。

ERROR
WARNING
INFO
DEBUG
TRACE

如果需要,您可以将级别更改为仅显示 WARNING 及以上。

于 2011-08-01T12:12:54.150 回答
0

这是我的做法,SimpleFormatter 的简化版本

package org.nibor.git_merge_repos;

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;


public class CustomLogFormatter extends Formatter {

    private final Date dat = new Date();

    private static final String seperator = " : ";

    public synchronized String format(LogRecord record) {
        dat.setTime(record.getMillis());
        return dat + seperator + record.getLevel().getName() + seperator + record.getMessage() + "\n";

    }
}
于 2017-12-20T14:03:52.737 回答