日志框架

  • JUL日志框架
    • 入门程序
    • Logger直接的父子继承关系
    • Formatters
    • 独立的配置文件进行编写日志
    • 使用日志打印异常

学习日志无非就是为了四大目的:

  1. 问题诊断,调试程序;
  2. 错误定位,定位数据问题、网络问题、内存问题等错误位置;
  3. 数据分析,点击行为、兴趣爱好等构成日志,方便下次基于推荐。

主流日志框架:

  • 日志实现(具体干活的):JUL(Java Util Logging)、Logback、log4j、log4j2.
  • 日志门面(指定规则的):JCL(Jakarta Commons Logging)、slf4j(Simple Logging Facade For Java).

JUL日志框架

JUL 全称 Java Util Logging 是Java原生的日志框架,使用时不需要另外引入第三方类库,相对于其他日志框架来说使用方便,学习简单,能够在小型应用中灵活使用。

JUL 的实现架构

在 JUL 中有以下关键组件:

  1. Loggers(日志):被称为记录器,应用程序通过获取 Logger 对象,调用其API来发布日志信息,用于记录系统或应用程序组件的消息;

  1. Appenders(输出源):也被称为 Handlers(处理器),每个Logger都会关联一组Handlers,Logger会将日志交给关联的 Haderler 处理,由 Handler 负责将日志做记录,Handlers 在此是一个抽象,其具体的实现决定了日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。

  1. Layouts(布局):也被称为 Formatters,它负责对日志事件中的数据进行转换和格式化。Layout 决定了数据在一条日志记录中的最终形式。

  1. Level(级别):每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,可以将 Level 和 Loggers 联系,Appenders 做关联以便我们过滤消息。

  1. Filters(过滤器):根据需要定制哪些信息会被记录,哪些信息会被放过。

入门程序

有关日志对应的配置信息在所使用的 jdk 的 conf 目录下的 logging.properties 文件中。

    // 获取一个 logger 对象private static final Logger LOGGER = Logger.getLogger("mylog");@Testpublic void testJUL() throws IOException {// 去掉默认配置LOGGER.setUseParentHandlers(false);//创建一个控制台处理器,并设置输出形式和设置日志级别Handler handler = new ConsoleHandler();handler.setFormatter(new SimpleFormatter());handler.setLevel(Level.ALL);// 创建一个文件处理器,并设置输出形式和设置日志级别Handler fileHandler = new FileHandler("D://logs/jul-001.log",true);fileHandler.setLevel(Level.WARNING);fileHandler.setFormatter(new SimpleFormatter());// 添加日志处理器,可以添加多个,多个都会执行。LOGGER.addHandler(fileHandler);LOGGER.addHandler(handler);LOGGER.setLevel(Level.ALL);LOGGER.severe("This is a severe message");LOGGER.warning("This is a warning message");LOGGER.info("This is a info message");LOGGER.fine("This is a fine message");LOGGER.finer("This is a finer message");}

注意:任何一个 logger 都是单例的,前提是名字相同。如下所测试:

Logger直接的父子继承关系

Logger 之间存在父子继承关系,由上面可以知道,Logger 对象是根据传进去的名字而创建的,是单例的。


默认条件下,子Logger 会继承父 Logger 中的属性(配置)。
使用下面语句可以不继承父类的配置:

logger.setUseParentHandlers(false);

下面代码举例看看如何继承的父类配置:

    @Testpublic void testPrarent(){Logger logger = Logger.getLogger(TestJUL.class.getName());// com.ncpowernode.test.TestJULLogger ncLogger = Logger.getLogger("com.ncpowernode.test");// 不使用 parent 的配置ncLogger.setUseParentHandlers(false);// 创建一个新的控制台处理器,并配置输出格式和级别Handler handler = new ConsoleHandler();handler.setFormatter(new SimpleFormatter());handler.setLevel(Level.ALL);// 父类进行配置,子类没有配置ncLogger.addHandler(handler);ncLogger.setLevel(Level.FINE);ncLogger.info("info");ncLogger.fine("fine");// 子类没有配置,按理说输出不了这条信息logger.fine("This is a fine message of son");}输出结果:2月 21, 2023 7:38:58 下午 com.ncpowernode.test.TestJUL testPrarent
信息: info
2月 21, 2023 7:38:58 下午 com.ncpowernode.test.TestJUL testPrarent
详细: fine
2月 21, 2023 7:38:58 下午 com.ncpowernode.test.TestJUL testPrarent
详细: This is a fine message of son

Formatters

可以看 Formatter 的一个实现类 SimpleFormatter类中的 format 方法的返回,可推测其如何实现的格式转换。

return String.format(format,zdt,source,record.getLoggerName(),record.getLevel().getLocalizedLevelName(),message,throwable);

看其返回值可以知道,无非是通过掉用 String 类中的 format 静态方法进行字符串转换的。

日期处理格式,%tx,其中x代表着日期转换符,以下是一些日期转换符的一些标志:

测试:

独立的配置文件进行编写日志

库中自行的配置是在 jdk 的主目录下的 conf 目录下的 logging.properties 配置文件中进行配置的,那能否进行自行编写配置文件进行配置呢?

通过源码可以发现,配置文件的读取和解析是通过 LogManager 对象进行实现的,然后通过读取的配置文件对 Logger 进行基本的管理配置。

下面是源码中 LogManager 对象的创建方式

LogManager manager = LogManager.getLogManager();

了解了源码,可以自行写配置文件然后自己读取了。

首先咱自己建一个配置文件,下面是文件内容:

以下是测试代码:

    @Testpublic void testLogManager() throws IOException {LogManager logManager = LogManager.getLogManager();//logManager.readConfiguration(new BufferedInputStream(TestJUL.class.getClassLoader().getResourceAsStream("logstudy.properties")));logManager.readConfiguration(new BufferedInputStream(new FileInputStream("src/main/resources/logstudy.properties")));Logger logger = Logger.getLogger(TestJUL.class.getName());logger.fine("This is a fine message!!!");}

结果展示:

使用日志打印异常

通过 Logger 类中的 throwing 方法的源码可以知道,如果需要打印异常日志,级别必须是FINER,否则直接返回结束该方法。

所以我们自行配置文件:

# RootHandler
# 开始清楚一个Logger可以搭配多个处理器handler
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler.level= FINERjava.util.logging.FileHandler.pattern = D://logs/java%u.log
java.util.logging.FileHandler.append = true # 是追加还是覆盖,true则是追加,false则是覆盖
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.maxLocks = 100
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatterjava.util.logging.ConsoleHandler.level = FINER
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 灵活进行转换
java.util.logging.ConsoleHandler.formatter.format = %4$s: %5$s [%1$tc] %6$s%n

然后编写代码测试:

 @Testpublic void testLogManager() throws IOException {LogManager logManager = LogManager.getLogManager();//logManager.readConfiguration(new BufferedInputStream(TestJUL.class.getClassLoader().getResourceAsStream("logstudy.properties")));logManager.readConfiguration(new BufferedInputStream(new FileInputStream("src/main/resources/logstudy.properties")));Logger logger = Logger.getLogger(TestJUL.class.getName());logger.finer("This is a finer message!!!");try{int i = 1/0;}catch(ArithmeticException e){logger.throwing(TestJUL.class.getName(),"testLogManager",e);}}

结果:

【日志框架-笔记】JUL日志框架的介绍及其使用相关推荐

  1. Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)

    1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...

  2. Java日志系统01 ---- JUL日志

    目录 前言 简介 使用 日志对象的父子关系 前言 当前文章只是学习笔记,具体请点击超链接:视频 简介 JUL日志是JDK自带的日志工具.无需引入任何依赖.在日常开发中并不会使用到JUL日志,仅用来作为 ...

  3. mysql业务 日志_mysql笔记之日志篇

    mysql中日志主要分为以下几种:错误日志.慢查询日志.二进制日志和事务日志. 1. 错误日志 记录mysql启动时发生的错误信息,没什么好说的,因为工作中不常用. 2. 慢查询日志 这是mysql维 ...

  4. SSH框架笔记_SSH三大框架的工作原理及流程

    Hibernate工作原理及为什么要用? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg ...

  5. mPaaS iOS框架笔记0-mPaaS iOS 框架初探(以MPH5Demo_plugin为例)

    1. mPaaS iOS 框架介绍 mPaaS iOS 框架源自支付宝客户端的开发框架,基于 Framework 的设计思想: 1.将业务隔离成相对独立的模块 2.着力追求模块与模块之间高內聚.低耦合 ...

  6. 01、JUL日志(JDK自带日志框架,包含源码分析)

    文章目录 前言 一.JUL架构介绍 1.1.认识不同组件 1.2.Logger 1.3.Handler 二.输出日志信息 三.自定义日志级别配置 3.1.认识Level类 3.2.输出不同等级日志 3 ...

  7. Java日志框架之JUL(java util logging)详解

    定义: JUL全称Java util logging,是java原生的日志框架,使用时不需要另外引入第三方类库,相对于其他框架使用方便,学习简单,能够在小型的应用中灵活使用. 架构: Applicat ...

  8. java日志框架(一)JUL 学习 ,这个是什么,他在代码中如何使用,一篇文章讲清楚

    这里写目录标题 JUL 是什么 JUL组件介绍 代码中如何使用(控制台输出) 日志级别 自定义输出级别 输出日志到文件(磁盘文件中) 日志对象父子关系 配置文件 使用方法总结 JUL 是什么 JUL全 ...

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

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

最新文章

  1. mysql的repeat()函数
  2. python新手教程 从零开始-让你从零开始学会写爬虫的5个教程(Python)
  3. Apache ZooKeeper - 事件监听机制详解
  4. 趣学python3(43)--时间 日期
  5. MySQL数据库和ACID模型
  6. Gerserver:发布shp文件
  7. matlab如何制作莫兰散点图,求大神指点绘制空间内散点图的包络面,,,散点程序如下...
  8. PostSQL编写经验(利用坐标值,创建空间要素字段)
  9. android app申请内存大小,Android中App可分配内存的大小
  10. rem 和 em 的区别
  11. 2020 dns排名_2020年最快的dns是多少_动漫台
  12. 【渝粤题库】广东开放大学 形成性考核 - 副本 (11)
  13. excel中COUNTIFS函数用法
  14. 自定义函数使用GridSearchCV参数寻优
  15. C语言调用 free 函数释放内存后指针指向及内存中的值是否改变的问题
  16. Feishu(飞书) 聊天机器人应用(3/3)- DevOps 机器人助手,管理 GitLab Issues,BOT 开源示例程序
  17. 远离那些聪明,却不厚道的人
  18. 今天接触个新概念——竞争情报
  19. 2022G1工业锅炉司炉考试题库及模拟考试
  20. React: error An unexpected error occurred: “EPERM: operation not permitted, rename...

热门文章

  1. 我没有抛弃SEO,没有离开度娘,只是选择相信马云
  2. 通话中联系人信息CallerInfo查询
  3. tbc 服务器在线,魔兽世界tbc部落什么服务器好_wow70tbc怀旧服部落服务器推荐_3DM网游...
  4. 定位ListView到指定的某一个条目
  5. 关于“用msconfig修改‘启动cpu核心数’最后开不了机?”问题的补充。
  6. 系统学习深度学习(二十五)--CNN调优总结
  7. ctf_常见编码笔记
  8. android手机怎么重启系统更新失败,安卓手机刷机失败怎么恢复?开不了机怎么办?...
  9. .Net Ria Services Preview 升级至 Wcf Ria Services Beta 记录
  10. 凯撒密码是古罗马凯撒大帝用来保护重要军情的加密系统。这套密码系统在现在看来很低级,但是在古罗马时期还是发挥了重要作用的。