11.5.5 处理器 其实通俗的说,这里的处理器就是日志输出的位置,以及对应此输出位置独立的配置内容,比如 FileHandler 是 输出到文件, ConsoleHandler 是输出到控制台。 public class Main { p
11.5.5 处理器
其实通俗的说,这里的处理器就是日志输出的位置,以及对应此输出位置独立的配置内容,比如 FileHandler 是 输出到文件, ConsoleHandler 是输出到控制台。
public class Main {public static void main(String[] args) throws IOException {
Main solution = new Main();
Logger logger = Logger.getLogger("com.dyy.jdk8");
//
FileHandler handler
= new FileHandler("logs.txt");
handler.setFormatter(new SimpleFormatter());
handler.setLevel(Level.WARNING);
logger.addHandler(handler);
// ConsoleHandler consoleHandler = new ConsoleHandler();
// consoleHandler.setLevel(Level.WARNING);
// logger.addHandler(consoleHandler);
logger.info("123");
logger.warning("456");
}
}
所有处理器,最终都源于 StreamHandler
双击 shift 输入 StreamHandler,跳到源码。光标移动到 StreamHandler 按住 F4
可以看到常用的 FileHandler 和 ConsoleHandler 都继承了这个类,自定义处理器继承 StreamHandler 即可。
11.5.6 过滤器
级别问题,可以通过 日志记录器 和 处理器 两者过滤。对于信息的细节,可以使用过滤器,比如日志中只保留含有123的,其他的不要:
public class Main {public static void main(String[] args) throws IOException {
Main solution = new Main();
Logger logger = Logger.getLogger("com.dyy.jdk8");
//
FileHandler handler
= new FileHandler("logs.txt");
handler.setFormatter(new SimpleFormatter());
handler.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
String message = record.getMessage();
return message.contains("123");
}
});
handler.setLevel(Level.INFO);
logger.addHandler(handler);
logger.info("123");
logger.warning("456");
}
}
11.5. 7 格式化器
简单的说就是拿到信息、级别这些信息之后怎么拼接,通过 setFormatter 方法定义:
import java.io.*;import java.util.*;
import java.util.logging.*;
import java.util.logging.Formatter;
public class Main {
private static final String format = LoggingSupport.getSimpleFormat();
public static void main(String[] args) throws IOException {
Main solution = new Main();
Logger logger = Logger.getLogger("com.dyy.jdk8");
//
FileHandler handler
= new FileHandler("logs.txt");
handler.setFormatter(new Formatter() {
private final Date dat = new Date();
@Override
public synchronized String format(LogRecord record) {
dat.setTime(record.getMillis());
String source;
if (record.getSourceClassName() != null) {
source = record.getSourceClassName();
if (record.getSourceMethodName() != null) {
source += " " + record.getSourceMethodName();
}
} else {
source = record.getLoggerName();
}
String message = formatMessage(record);
String throwable = "";
if (record.getThrown() != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println();
record.getThrown().printStackTrace(pw);
pw.close();
throwable = sw.toString();
}
return String.format(format,
dat,
source,
record.getLoggerName(),
"[yu_duan_hun]"+record.getLevel().getName(),
message,
throwable);
}
});
handler.setLevel(Level.INFO);
logger.addHandler(handler);
logger.info("123");
logger.warning("456");
}
}
可以看到,输出信息前多了一个[yu_duan_hun]
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论