Java日志框架简介

  • 一.Java日志框架历史总体概述
  • 二. JUL(Java Util Logging)简介
    • JUL的日志级别
    • 简单的输出INFO日志的示例:
    • 输出各个级别的日志信息
    • Logger的父子关系
    • 使用配置文件来控制日志的输出级别

一.Java日志框架历史总体概述

Java框架现在主要是分为两个大的日志门面: JCL、slf4j

日志框架的实现主要是一下这几种 JUL(java原生自带)、logback()、log4j、log4j2

历史及总体简介等我稍后了解完毕之后在进行编写,稍后再继续编写吧,先说明怎么进行使用哈>>>   ^_^

二. JUL(Java Util Logging)简介

JUL是sun公司推出的jdk原生的日志框架,使用JUL无需进行导入包

JUL的日志级别

JUL的日志主要分为一下几个级别:

          SEVERE(最高值)WARNINGINFO (默认级别)CONFIGFINEFINERFINEST(最低值)* 还有两个特殊的级别:OFF,可用来关闭日志记录。ALL,启用所有消息的日志记录。

简单的输出INFO日志的示例:

首先获取日志记录器对象,其实这个里面随便填啥都能使用,但是不能填写空字符串. 默认的日志输出级别即为INFO级别,低于INFO级别的都不会进行输出

    @Testpublic void test1() {// 获取日志记录器对象Logger logger = Logger.getLogger("com.huqi.JULTest");// 日志记录输出logger.info("hello jul");// 通用方法进行日志记录logger.log(Level.INFO, "info msg");System.out.printf("-------------------------------------------------------------");String name  = "胡琦";Integer age = 24;// 自带的占位符转换logger.log(Level.INFO, "name  = {0}, age = {1}", new Object[]{name, age});}

输出各个级别的日志信息

 @Testpublic void test2() throws IOException {// 获取日志记录器对象Logger logger = Logger.getLogger("com.huqi.JULTest");// 关闭jul默认的日志级别logger.setUseParentHandlers(false);// 一个日志格式处理器SimpleFormatter simpleFormatter = new SimpleFormatter();// 控制台处理器, 输出信息控制台ConsoleHandler consoleHandler = new ConsoleHandler();consoleHandler.setFormatter(simpleFormatter);// 文件处理器, 输出到文件去FileHandler fileHandler = new FileHandler("D:/test.log");fileHandler.setFormatter(simpleFormatter);// 将处理器添加到日志记录器对象中logger.addHandler(consoleHandler);logger.addHandler(fileHandler);// 设置自己需要的细粒度,全部开启logger.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);fileHandler.setLevel(Level.ALL);// 现在可以输出所有的日志级别了logger.fine("fine");logger.finer("fine");logger.finest("fine");logger.info("fine");logger.warning("fine");logger.severe("fine");logger.config("fine");}

控制台打印的信息

输出在D盘的日志文件

Logger的父子关系

    /***  logger 的父子关系*/@Testpublic void test3() {//分别获取父子包的两个日志对象Logger logger1 = Logger.getLogger("com.huqi");Logger logger2 = Logger.getLogger("com");// trueSystem.out.println(logger1.getParent() == logger2);// 获取日志记录器的顶级父元素  LogManager$RootLogger  name = ""// logger2 Parent: java.util.logging.LogManager$RootLogger@deb6432 ,name :System.out.println("logger2 Parent: " + logger2.getParent() +" ,name : " + logger2.getParent().getName());// 关闭默认日志级别配置logger2.setUseParentHandlers(false);// 设置处理器ConsoleHandler consoleHandler = new ConsoleHandler();SimpleFormatter simpleFormatter = new SimpleFormatter();consoleHandler.setFormatter(simpleFormatter);logger2.addHandler(consoleHandler);// 设置了父的日志级别全开logger2.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);// logger1继承了logger2的日志设置,可以进行输出所有的日志级别// 现在可以输出所有的日志级别了logger1.fine("fine");logger1.finer("fine");logger1.finest("fine");logger1.info("fine");logger1.warning("fine");logger1.severe("fine");logger1.config("fine");}

使用配置文件来控制日志的输出级别

    /*** 加载自定义配置文件*/@Testpublic void test4() throws IOException {// 读取配置文件, 通过类加载器InputStream resource = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");// 创建LogManagerLogManager logManager = LogManager.getLogManager();// 通过LogManager配置文件logManager.readConfiguration(resource);// 创建日志记录器Logger logger = Logger.getLogger("com.huqi");logger.fine("fine");logger.finer("fine");logger.finest("fine");logger.info("fine");logger.warning("fine");logger.severe("fine");logger.config("fine");}

logging.properties

# 默认的处理器: 控制台输出
handlers =java.util.logging.ConsoleHandler
# 默认的日志级别是info
.level = ALL# 格式处理器
# 默认的处理器: 控制台输出  文件输出
handlers =java.util.logging.ConsoleHandler,java.util.logging.FileHandler
# 默认的日志级别是info
.level = ALLjava.util.logging.ConsoleHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
java.util.logging.ConsoleHandler.level = ALLjava.util.logging.FileHandler.pattern = D://java%u.Log
java.util.logging.FileHandler.limit = 50000
java.utiL.logging.FiLeHandler.count = 1
java.utiL.logging.FileHandler.formatter = java.util.logging.XMLFormatterorg.hibernate.validator.internal.util.Version.level = WARNING
org.apache.coyote.http11.Http11NioProtocol.level = WARNING
org.apache.tomcat.util.net.NioSelectorPool.level = WARNING
org.apache.catalina.startup.DigesterFactory.level = SEVERE
org.apache.catalina.util.LifecycleBase.level = SEVERE
org.eclipse.jetty.util.component.AbstractLifeCycle.level = SEVERE


具体如何使用日志框架以及如何包装日志的工具类,可看参考此github链接的日志工具类,使用的是slfj+logback进行日志的输出.
https://gitee.com/huqidake/spring-boot-demo

可参考如下的代码进行配置,使用那个的是xml文件,同样也可以使用一个yml文件操作.

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--><property name="LOG_HOME" value="/home" /><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%logger{50}] - %msg%n</pattern></encoder></appender><!-- 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT" /></root>
</configuration>
package com.huqi.log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.text.MessageFormat;/*** 日志工具类* @author 胡琦* @date 2021-07-24 星期六 16:03*/
public class LoggerUtil {private final static Logger LOGGER = LoggerFactory.getLogger(LoggerUtil.class);public static void info(Logger logger, String template, String... args) {if (logger.isInfoEnabled()) {logger.info(joint(template, args));}}public static void warn(Logger logger, String template, String... args) {logger.warn(joint(template, args));}public static void warn(Throwable throwable, Logger logger, String template, String... args) {logger.warn(joint(template, args), throwable);}public static void error(Logger logger, String template, String... args) {logger.error(joint(template, args));}public static void error(Throwable throwable, Logger logger, String template, String... args) {logger.error(joint(template, args), throwable);}/*** 解析占位符,返回拼接好的字符串*** 我自己的实现方式**     // {*     private static final char PREFIX = 123;*     // }*     private static final char SUFFIX = 125;**     private static Set numSet = new HashSet(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));** private static String joint(String msg, String... msgs) {*         if (StringUtils.isBlank(msg) || msg == null || msgs.length == 0) {*             return msg;*         }*         final char[] chars = msg.toCharArray();*         StringBuilder stringBuilder = new StringBuilder();*         try {*             for (int i = 0; i < chars.length;) {*                 char c = chars[i];*                 if (c == PREFIX && chars[i+2] == SUFFIX) {*                     Integer index = Integer.valueOf(Character.toString(chars[i + 1]));*                     boolean contains = numSet.contains(index);*                     if (contains) {*                         stringBuilder.append(msgs[index]);*                     }*                     i = i+2;*                     continue;*                 }*                 if (c == SUFFIX) {*                     i++;*                     continue;*                 }*                 stringBuilder.append(c);*                 i++;*             }*         }catch (Exception e) {*             LOGGER.error("LoggerUtils joint error");*             return msg;*         }*         return stringBuilder.toString();*     }*** @param msg  模板参数 示例*                          test1 = {0}, test2 = {1}*             填充的参数从0开始,数字和花括号之间不能有空格* @param args 需要填充的参数,* @return*/private static String joint(String msg, String... args) {try {return MessageFormat.format(msg, args);} catch (Exception e) {LOGGER.error("日志打印异常", e);}return null;}}

Java 日志框架简介相关推荐

  1. Java日志框架简介

    一.java日志发展线路图 上面涵盖了java世界里主要的日志框架或门面,注意,jcl和slf4j是日志门面,因此,在slf4j之前的日志框架,要使用桥接模式来适应slf4j的通用接口,达到统一接口调 ...

  2. java中log占位符,java日志框架简介

    Java Log Frameworks 常见的java日志框架和实现主要有: slf4j log4j logback apache jakarta commons-logging java.util. ...

  3. java日志框架简介(日志框架选型)

    目录 日志框架发展历程 实现框架 log4j1 JUL logback log4j2 门面日志 SLF4J JCL Spring-JCL Jboss-logging 日志框架选型 日志框架发展历程 现 ...

  4. Java日志框架——Logback

    Java日志框架--Logback 简介 1.1 Logback概述 1.2 日志级别 1.3 组件 1.4 配置文件 1.5 日志输出格式 项目中应用步骤 2.1 依赖 2.2 日志输出到控制台 2 ...

  5. Java日志框架学习--JUL和Log4j--上

    Java日志框架学习--JUL和Log4j--上 引言 日志框架 市面流行的日志框架 日志门面和日志框架的区别 JUL JUL简介 JUL组件介绍 实际使用 Logger之间的父子关系 默认配置文件位 ...

  6. 最牛逼的 Java 日志框架

    Logback 算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了.不过logback最近一个稳定版本还停留在 2017 年,好几年都没有更新:logback的兄弟 slf ...

  7. 最牛逼的 Java 日志框架,性能无敌,横扫所有对手

    Logback 算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了.不过logback最近一个稳定版本还停留在 2017 年,好几年都没有更新:logback的兄弟 slf ...

  8. 最牛逼的 Java 日志框架,还不学习。。。

    最牛逼的 Java 日志框架,性能无敌,横扫所有对手- Logback 算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了.不过logback最近一个稳定版本还停留在 20 ...

  9. 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)

    文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...

  10. 学习Java日志框架之——搞懂JUL(java.util.logging)

    文章目录 系列文章目录 一.JUL简介 二.JUL组件介绍 三.代码实例 1.入门案例 2.日志级别 (1)默认日志级别源码分析 3.自定义日志级别 4.将日志输出到文件中 5.Logger的父子关系 ...

最新文章

  1. 大盘点|YOLO 系目标检测算法总览
  2. 品牌网络推广方案浅析在编写文章标题时都有什么技巧?
  3. autumn 0.5.1 : Python Package Index
  4. 如何取消掉计算机更新图标,XP系统如何关闭右下角中的自动更新图标?
  5. 为您的Office文档加把锁-ADRMS的安装
  6. python列表map函数_python中map函数怎么显示结果
  7. HDU1214 圆桌会议(找规律,数学)
  8. Java中如何读取文件夹下的所有文件
  9. 用sqlalchemy对mysql数据库增删改查demo
  10. cmd 命令行中乱码问题解决
  11. 写插件代码查看单据简单示例分享
  12. MyBatis概述与架构
  13. 计算机二级c语言带小抄,计算机二级C语言上机题库(可缩印做小抄)..docx
  14. 关键词工具(seo常用关键词工具有哪些?)
  15. 当前网络上迅雷各版本实际效果研究报告
  16. FRM 5.1 现代投资组合理论
  17. Chrome扩展框架-Vue项目(用vue配合webpack实现浏览器扩展,包含热更新,无需重复加载浏览器插件)
  18. 计算机科学编辑部态度,计算机科学期刊介绍--各种杂志投稿方式与评价(转)...
  19. 【时空序列预测第十五篇】HPRNN: A HIERARCHICAL SEQUENCE PREDICTION MODEL FOR LONG-TERM WEATHER RADAR ECHO EXTRAPO
  20. TI公司与MSP430单片机

热门文章

  1. JAVAWEB开发之Hibernate详解(二)——Hibernate的持久化类状态与转换、以及一级缓存详解、关联关系的映射(一对多、多对多、级联)
  2. 《Understanding WiFi Signal Frequency Features for Position-Independent Gesture Sensing》论文总结
  3. 电子邮件链接格式html主题,html创建电子邮件链接的方法
  4. 第一次创建百度脑图介绍自己,把创建过程分享一下吧,嘿嘿。
  5. Shim特性是什么?
  6. python如何对excel批量加密_用python加密excel工作表
  7. 一个蚂蚁森林能量自动收获脚本
  8. PS——图像处理知识点
  9. 计算机网络适配器找不到,网络适配器不见了怎么办?电脑Windows网络适配器不见了的5个解决方法...
  10. 代理模式(委托模式)— 结构型