• JUL日志讲解


    这是JDK为我们提供的日志框架,位于`java.util.logging`包下,通过日志输出的结果会更加规范

    1. public class Main {
    2. public static void main(String[] args) {
    3. // 首先获取日志打印器
    4. Logger logger = Logger.getLogger(Main.class.getName());
    5. // 调用info来输出一个普通的信息,直接填写字符串即可
    6. logger.info("我是普通的日志");
    7. }
    8. }

     输出

    十一月 15, 2021 12:55:37 下午 com.test.Main main

    信息: 我是普通的日志

    日志分为7个级别,详细信息我们可以在Level类中查看:

    *  SEVERE(最高值)- 一般用于代表严重错误

    * WARNING  - 一般用于表示某些警告,但是不足以判断为错误

    *  INFO (默认级别)  -  常规消息

    *  CONFIG config

    *  FINE

    *  FINER

    *  FINEST(最低值)finest

    通过`log`方法来设定该条日志的输出级别:

    1. public static void main(String[] args) {
    2. Logger logger = Logger.getLogger(Main.class.getName());
    3. logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));
    4. logger.log(Level.WARNING, "警告的内容");
    5. logger.log(Level.INFO, "普通的信息");
    6. logger.log(Level.CONFIG, "级别低于普通信息");
    7. }

    级别低于默认级别的日志信息,无法输出到控制台,我们可以通过设置来修改日志的打印级别

    1. public static void main(String[] args) {
    2. Logger logger = Logger.getLogger(Main.class.getName());
    3. //修改日志级别
    4. logger.setLevel(Level.CONFIG);
    5. //不使用父日志处理器
    6. logger.setUseParentHandlers(false);
    7. //使用自定义日志处理器
    8. ConsoleHandler handler = new ConsoleHandler();
    9. handler.setLevel(Level.CONFIG);
    10. logger.addHandler(handler);
    11. logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));
    12. logger.log(Level.WARNING, "警告的内容");
    13. logger.log(Level.INFO, "普通的信息");
    14. logger.log(Level.CONFIG, "级别低于普通信息");
    15. }

    每个`Logger`都有一个父日志打印器,我们可以通过`getParent()`来获取,得到的是`java.util.logging.LogManager$RootLogger`这个类,它默认使用的是ConsoleHandler,且日志级别为INFO,由于每一个日志打印器都会直接使用父类的处理器,因此我们之前需要关闭父类然后使用我们自己的处理器。

    日志处理器不仅仅只有控制台打印,我们也可以使用文件处理器来处理日志信息

    1. //添加输出到本地文件
    2. FileHandler fileHandler = new FileHandler("test.log");
    3. fileHandler.setLevel(Level.WARNING);
    4. logger.addHandler(fileHandler);

    如果日志的打印格式我们不喜欢,我们还可以自定义打印格式,比如我们控制台处理器就默认使用的是`SimpleFormatter`,而文件处理器则是使用的`XMLFormatter`

    1. //使用自定义日志处理器(控制台)
    2. ConsoleHandler handler = new ConsoleHandler();
    3. handler.setLevel(Level.CONFIG);
    4. handler.setFormatter(new XMLFormatter());
    5. logger.addHandler(handler);

    日志可以设置过滤器,如果我们不希望某些日志信息被输出,我们可以配置过滤规则:

    1. public static void main(String[] args) throws IOException {
    2. Logger logger = Logger.getLogger(Main.class.getName());
    3. //自定义过滤规则
    4. logger.setFilter(record -> !record.getMessage().contains("普通"));
    5. logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));
    6. logger.log(Level.WARNING, "警告的内容");
    7. logger.log(Level.INFO, "普通的信息");
    8. }

    打印格式还可以自行实现

    1. public static void main(String[] args) throws IOException {
    2. Logger logger = Logger.getLogger(Main.class.getName());
    3. logger.setUseParentHandlers(false);
    4. //为了让颜色变回普通的颜色,通过代码块在初始化时将输出流设定为System.out
    5. ConsoleHandler handler = new ConsoleHandler(){{
    6. setOutputStream(System.out);
    7. }};
    8. //创建匿名内部类实现自定义的格式
    9. handler.setFormatter(new Formatter() {
    10. @Override
    11. public String format(LogRecord record) {
    12. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    13. String time = format.format(new Date(record.getMillis())); //格式化日志时间
    14. String level = record.getLevel().getName(); // 获取日志级别名称
    15. // String level = record.getLevel().getLocalizedName(); // 获取本地化名称(语言跟随系统)
    16. String thread = String.format("%10s", Thread.currentThread().getName()); //线程名称(做了格式化处理,留出10格空间)
    17. long threadID = record.getThreadID(); //线程ID
    18. String className = String.format("%-20s", record.getSourceClassName()); //发送日志的类名
    19. String msg = record.getMessage(); //日志消息
    20. //\033[33m作为颜色代码,30~37都有对应的颜色,38是没有颜色,IDEA能显示,但是某些地方可能不支持
    21. return "\033[38m" + time + " \033[33m" + level + " \033[35m" + threadID
    22. + "\033[38m --- [" + thread + "] \033[36m" + className + "\033[38m : " + msg + "\n";
    23. }
    24. });
    25. logger.addHandler(handler);
    26. logger.info("我是测试消息1...");
    27. logger.log(Level.INFO, "我是测试消息2...");
    28. logger.log(Level.WARNING, "我是测试消息3...");
    29. }

    使用Lombok快速开启日志

    1. @Log
    2. public class Main {
    3. public static void main(String[] args) {
    4. System.out.println("自动生成的Logger名称:"+log.getName());
    5. log.info("我是日志信息");
    6. }
    7. }

    添加`@Log`注解就可以直接使用一个静态变量log,而它就是自动生成的Logger

    1. @Log(topic = "zzp")
    2. public class Main {
    3. public static void main(String[] args) {
    4. System.out.println("自动生成的Logger名称:"+log.getName());
    5. log.info("我是日志信息");
    6. }
    7. }

  • 相关阅读:
    linux系统docker的使用命令
    Spring6学习技术|Junit
    QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo
    Unet心电信号分割方法(Pytorch)
    C++ Reference: Standard C++ Library reference: C Library: cctype: isspace
    多线程高频考点(如何解决死锁,谈谈HashMap HashTable ConcurrentHashMap的区别)
    MATLAB矩阵
    ElementUI之首页导航+左侧菜单->mockjs,总线
    RabbitMQ: Publish/Subscribe结构
    Redis之Redis 6.0中Hash(ziplist)解读
  • 原文地址:https://blog.csdn.net/weixin_51992178/article/details/126461490