1、日志的概念

1.1日志文件

      日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。

在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件 。

许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网 工程任务组(IETF )RFC 5424中定义的syslog。 syslog标准使专用的标准化子系统能够生成,过滤,记录和分析日志消息。

1.1.1 调试日志
软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所有我们需要专业的日志技术。java中寻找bug会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更方便的去重现问题。

1.1.2 系统日志
系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用程序日志和安全日志。

系统日志的价值
系统日志策略可以在故障刚刚发生时就向你发送警告信息,系统日志帮助你在最短的时间内发现问题。系统日志是一种非常关键的组件,因为系统日志可以让你充分了解自己的环境。这种系统日志信息对于决定故障的根本原因或者缩小系统攻击范围来说是非常关键的,因为系统日志可以让你了解故障或者袭击发生之前的所有事件。为虚拟化环境制定一套良好的系统日志策略也是至关重要的,因为系统日志需要和许多不同的外部组件进行关联。良好的系统日志可以防止你从错误的角度分析问题,避免浪费宝贵的排错时间。另外一种原因是借助于系统日志,管理员很有可能会发现一些之前从未意识到的问题,在几乎所有刚刚部署系统日志的环境当中。

2. JAVA 日志框架

问题:
1. 控制日志输出的内容和格式
2. 控制日志输出的位置
3. 日志优化:异步日志,日志文件的归档和压缩
4. 日志系统的维护
5. 面向接口开发 -- 日志的门面

2.1 为什么要用日志框架
因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计 。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事务处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

2.2 现有的日志框架
JUL(java util logging)、logback、log4j、log4j2
JCL(Jakarta Commons Logging)、slf4j( Simple Logging Facade for Java)

日志门面:JCL、slf4j
日志实现:JUL、logback、log4j、log4j2

3. JUL 学习

3.1 JUL入门
3.1.1 架构介绍

Loggers:被称为记录器,应用程序通过获取Logger对象,调用其API来来发布日志信息。Logger通常时应用程序访问日志系统的入口程序。

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

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

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

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

总结一下就是:
用户使用Logger来进行日志记录,Logger持有若干个Handler,日志的输出操作是由Handler完成的在Handler在输出日志前,会经过Filter的过滤,判断哪些日志级别过滤放行哪些拦截,Handler会将日志内容输出到指定位置(日志文件、控制台等)。Handler在输出日志时会使用Layout,将输出内容进行排版。

pom文件中需要添加测试的依赖项和设置jdk版本

 <dependencies><!--单元测试:通过单元测试可以测试每一个方法--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><plugins><plugin>    <!--设置jdk版本为1.8--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration></plugin></plugins></build>

3.1.2 入门案例

 //快速入门测试@Testpublic void test01 ()throws  Exception{//1、获取日志记录器对象Logger logger = Logger.getLogger("edu.xust.jULtest");   //类的全限定名称//2、日志记录的输出过程logger.info("Hello JUL");//通用方法进行日志记录logger.log(Level.INFO,"info msg");//通过占位符的方式,输出变量的值String name= "zhangsan";Integer age = 23;logger.log(Level.INFO,"用户信息:{0},{1}",new Object[]{name,age});}

测试结果:

3.2 日志的级别
jul中定义的日志级别

虽然我们测试了 7个日志级别但是默认只实现info以上的级别

 @Testpublic void test02()throws Exception{//1、获取日志记录器对象Logger logger = Logger.getLogger("edu.xust.jULtest");//2、日志记录的输出logger.severe("severe");       //最高级别logger.warning("warning");logger.info("info");           //jul默认日志级别,比info高的输出,比info低的过滤掉logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

自定义日志级别配置

 //自定义日志级别@Testpublic void test03()throws Exception{//1、获取日志记录器对象Logger logger = Logger.getLogger("edu.xust.jULtest");//5、关闭系统默认配置logger.setUseParentHandlers(false);//2、自定义配置日志级别//创建ConsoleHandler对象  【控制台输出】ConsoleHandler consoleHandler = new ConsoleHandler();//3、创建简单格式转换对象SimpleFormatter formatter = new SimpleFormatter();//4、进行关联consoleHandler.setFormatter(formatter);logger.addHandler(consoleHandler);//6、配置日志的具体级别logger.setLevel(Level.ALL);            //输出所有//7、控制具体处理器的日志级别consoleHandler.setLevel(Level.ALL);//8、创建FileHandler,文件输出FileHandler handler = new FileHandler("E:/code/maven/jul_demo/logs/jul.log");   //需要自己新建目录//9、进行关联//格式转换输出handler.setFormatter(formatter);logger.addHandler(handler);//日志记录的输出logger.severe("severe");       //最高级别logger.warning("warning");logger.info("info");           //jul默认日志级别,比info高的输出,比info低的过滤掉logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

3.3 Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。

//Logger对象的父子关系@Testpublic void test04()throws Exception{//获取日志记录器对象Logger logger1 = Logger.getLogger("edu.xust");Logger logger2 = Logger.getLogger("edu");       //logger1是logger2的子对象//测试System.out.println(logger1.getParent() == logger2);   //true//测试logger2 的父类   //LogManager$RootLogger是所有日志记录器的顶级父元素,名称是空字符串System.out.println("logger2 Parent: "+logger2.getParent() +" name:"+logger2.getParent().getName());/*** 以下是设置logger2的日志级别,logger1继承logger2*///关闭默认配置logger2.setUseParentHandlers(false);//2、自定义配置日志级别//创建ConsoleHandler对象  【控制台输出】ConsoleHandler consoleHandler = new ConsoleHandler();//3、创建简单格式转换对象SimpleFormatter formatter = new SimpleFormatter();//4、进行关联consoleHandler.setFormatter(formatter);logger2.addHandler(consoleHandler);//6、配置日志的具体级别logger2.setLevel(Level.ALL);            //输出所有//7、控制具体处理器的日志级别consoleHandler.setLevel(Level.ALL);//日志记录的输出   alt+鼠标左键拖动logger1.severe("severe");       //最高级别logger1.warning("warning");logger1.info("info");           //jul默认日志级别,比info高的输出,比info低的过滤掉logger1.config("config");logger1.fine("fine");logger1.finer("finer");logger1.finest("finest");}

3.4 日志的配置文件
默认配置文件路径$JAVAHOME\jre\lib\logging.properties。将该文件拷贝至resources目录下。

 //加载自定义配置文件@Testpublic void test05() throws Exception{//1、读取配置文件,通过类加载器InputStream ins = jULtest.class.getClassLoader().getResourceAsStream("logging.properties");//2、创建logManager对象LogManager logManager = LogManager.getLogManager();//3、通过logManager加载配置文件logManager.readConfiguration(ins);//4、创建日志记录器Logger logger = Logger.getLogger("edu.xust.jULtest");//日志记录的输出   alt+鼠标左键拖动logger.severe("severe");       //最高级别logger.warning("warning");logger.info("info");           //jul默认日志级别,比info高的输出,比info低的过滤掉logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

对logging.properties文件中进行解释和添加内容。这里设置后,

可以将日志输出在控制台handlers= java.util.logging.ConsoleHandler

或者日志文件handlers=  java.util.logging.FileHandler,

也可以设置其输出格式

控制台:java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

日志文件:java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter


#此时默认的处理器有两个:向控制台输出,格式是SimpleFormatter、向日志文件中输出,格式是XMLFormatter#RootLogger 顶级父元素指定的默认处理器:ConsoleHandler
#handlers= java.util.logging.ConsoleHandler
handlers=  java.util.logging.FileHandler#RootLogger 顶级父元素的默认日志级别:ALL
.level= ALL#保存到日志文件中的设置
#指定日志文件路径  E:/code/maven/jul_demo/logs/java0.log
java.util.logging.FileHandler.pattern = E:/code/maven/jul_demo/logs/java%u.log
#指定日志文件大小为50000条
java.util.logging.FileHandler.limit = 50000
#指定日志文件的数量
java.util.logging.FileHandler.count = 1
#指定Handler对象日志消息格式对象
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
#指定以追加的方式添加日志内容
java.util.logging.FileHandler.append = true#向控制台输出Handler对象
#指定Handler对象的日志级别
java.util.logging.ConsoleHandler.level = ALL
#指定Handler对象的消息格式对象
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
#指定handler对象字符集
java.util.logging.ConsoleHandler.encoding = UTF-8
#指定消息格式
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%ncom.xyz.foo.level = SEVERE

3.5 日志原理解析
1. 初始化LogManager
1. LogManager加载logging.properties配置
2. 添加Logger到LogManager
2. 从单例LogManager获取Logger
3. 设置级别Level,并指定日志记录LogRecord
4. Filter提供了日志级别之外更细粒度的控制
5. Handler是用来处理日志输出位置
6. Formatter是用来格式化LogRecord的

参考资料:黑马程序员【日志技术】

日志技术之JUL入门相关推荐

  1. java中的特殊文件、日志技术、多线程入门

    一,属性文件( .properties) 1,特殊文件概述(必会) 我们知道IO流是用来读数据,目的是为了获取其中的信息供我们使用,但是普通的txt文件是杂乱无章的,除非我们规定,自己写.虽然可以但是 ...

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

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

  3. Java的常用日志技术详解(一)

    日志文件 日志文件是用于记录系统操作事件的文件集合. 日志文件它具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要的作用. 日志种类 调试日志 调试程序,或者做一些状态的输出,便于我们查询程序的 ...

  4. 大数据技术之Canal入门篇

    大数据技术之Canal入门篇 文章目录 大数据技术之Canal入门篇 写在前面 第 1 章 Canal 入门 1.1 什么是 Canal 1.2 MySQL 的Binlog 1.2.1 什么是 Bin ...

  5. 小白玩大数据日志分析系统经典入门实操篇FileBeat+ElasticSearch+Kibana 实时日志系统搭建从入门到放弃

    大数据实时日志系统搭建 距离全链路跟踪分析系统第二个迭代已经有一小阵子了,由于在项目中主要在写ES查询\Storm Bolt逻辑,都没有去搭建实时日志分析系统,全链路跟踪分析系统采用的开源产品组合为F ...

  6. java架构师入门教程,java技术架构师入门到精通高薪就业教程百度云下载

    java技术架构师入门到精通高薪就业视频教程百度云 课程目录: JAVA架构课开班典礼 JVM性能调优专题 JVM整体结构深度解析 JVM内存分配机制详解(此视频作废) JVM字节码文件结构深度剖析 ...

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

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

  8. 日志实时分析:从入门到精通

    日志实时分析:从入门到精通 为什么要实时分析日志 做业务的人,常常需要面临以下问题: 产品的受欢迎程度怎么样?该重点投入到哪个功能中? 各个营销渠道的流量怎么样? 该向哪个渠道投入更多资源? 各个阶段 ...

  9. 分布式系统原理 之5 日志技术

    分布式系统原理 日志技术 日志技术是宕机恢复的主要技术之一[3].日志技术最初使用在数据库系统中.严格来说日志技术不是一种分布式系统的技术,但在分布式系统的实践中,却广泛使用了日志技术做宕机恢复,甚至 ...

  10. 直播P2P技术1-技术入门

    直播P2P技术1-技术入门 1. 直播协议 直播协议主要有RTMP,HLS,MPEG-DASH,RTSP,HTTP-FLV等.每种协议都各有长短,比如RTMP延迟低,但诞生于Adobe,依赖于Flas ...

最新文章

  1. 二叉树:二叉搜索树实现 逆序数问题
  2. LBE 隐私卫士原理分析
  3. BZOJ-1053-反素数ant
  4. Python培训:学完Python可以做什么?
  5. svn提交错误file is scheduled for addition, but is missing
  6. CompletableFuture详解~completeExpectionally
  7. mysql必知必会--用通配符进行过滤
  8. 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
  9. java异常处理思考题_java异常处理试题及答案
  10. bat文件如何获取输入内容并写入文件
  11. 为什么 Python 4.0 会与 Python 3.0 不同?
  12. Struts2零配置属性详解(2)
  13. jetty文件服务器,在Jetty中访问Web容器外部的文件
  14. 小米路由器梅林_小米路由器刷Merlin
  15. MATLAB中改变默认工作路径的方法
  16. c语言入门 输出图形(1),C语言图形输出习题(1).pdf
  17. Coder中的Templates
  18. DOS批处理文件加密文件夹
  19. stm32:时钟系统
  20. 用户-渠道的ROI计算及优化方案

热门文章

  1. Android打造通用标题栏——让你的App统一标题栏风格
  2. codeforces gym100851 Generators 暴力+贪心
  3. java web 测试要点记录
  4. ue编辑器php漏洞:ueditor getshell
  5. 线段树+平衡树(STL) 勤快的love 枫
  6. 文本超出省略号、css三角形、画虚线边框、修改输入框placeholder样式、修改滚动条样式、css实现优惠券
  7. python毕业设计论文-基于Python的网络爬虫的设计与实现.doc
  8. 360发起网民隐私保卫战
  9. plc与计算机怎么网络连接 图,PLC与输入/输出设备的连接图解
  10. 中科院计算机所博士何飞,2017年中科院计算所博士生招生考试说明