《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》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!