> 文档中心 > 《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试(7)处理器、过滤器、格式化器

《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试(7)处理器、过滤器、格式化器


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》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!