没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
日志技术
0.学习目标
1. 日志的作用和目的
2. 日志的框架
3. JUL的使用
4. LOG4J的使用
5. JCL的使用
6. 日志门面和日志体系
7. SLF4J
8. logback的使用
9. log4j2的使用
10. SpringBoot中的日志使用
1.日志的概念
1.1 日志文件
日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、
诊断问题的追踪以及理解系统的活动等重要作用。
在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之
间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件。
许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网工程任务组
(IETF)RFC5424中定义的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( Java Commons Logging )、slf4j( Simple Logging Facade For Java )
日志门面
JCL slf4j
日志实现
JUL、logback、log4j、log4j2
3.JUL学习
JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日
志框架使用方便,学习简单,能够在小型应用中灵活使用。
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,将输出内
容进行排版
3.1.2 入门案例
3.2 日志的级别
jul中定义的日志级别
虽然我们测试了7个日志级别但是默认只实现info以上的级别
public class JULTest {
@Test
public void testQuick() throws Exception {
// 1.创建日志记录器对象
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
// 2.日志记录输出
logger.info("hello jul");
logger.log(Level.INFO, "info msg");
String name = "jack";
Integer age = 18;
logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
* java.util.logging.Level中定义了日志的级别:
SEVERE(最高值)
WARNING
INFO (默认级别)
CONFIG
FINE
FINER
FINEST(最低值)
* 还有两个特殊的级别:
OFF,可用来关闭日志记录。
ALL,启用所有消息的日志记录。
1
2
3
4
5
6
7
8
9
10
11
自定义日志级别配置
@Test
public void testLogLevel() throws Exception {
// 1.获取日志对象
Logger logger = Logger.getLogger("com.itheima.log.QuickTest");
// 2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("cofnig");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void testLogConfig() throws Exception {
// 1.创建日志记录器对象
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
// 一、自定义日志级别
// a.关闭系统默认配置
logger.setUseParentHandlers(false);
// b.创建handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
// e.设置日志级别
logger.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
// 二、输出到日志文件
FileHandler fileHandler = new FileHandler("d:/logs/jul.log");
fileHandler.setFormatter(simpleFormatter);3.3 Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个
顶层
RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径
来关联。
logger.addHandler(fileHandler);
// 2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
3.3 Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层
RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。
3.4 日志的配置文件
默认配置文件路径$JAVAHOME\jre\lib\logging.properties
@Test
public void testLogParent() throws Exception {
// 日志记录器对象父子关系
Logger logger1 = Logger.getLogger("com.itheima.log");
Logger logger2 = Logger.getLogger("com.itheima");
System.out.println(logger1.getParent() == logger2);
// 所有日志记录器对象的顶级父元素 class为
java.util.logging.LogManager$RootLogger
name为""
System.out.println("logger2 parent:" + logger2.getParent() + ",name:" +
logger2.getParent().getName());
// 一、自定义日志级别
// a.关闭系统默认配置
logger2.setUseParentHandlers(false);
// b.创建handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger2.addHandler(consoleHandler);
// e.设置日志级别
logger2.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
// 测试日志记录器对象父子关系
logger1.severe("severe");
logger1.warning("warning");
logger1.info("info");
logger1.config("config");
logger1.fine("fine");
logger1.finer("finer");
logger1.finest("finest");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Test
public void testProperties() throws Exception {
// 读取自定义配置文件
InputStream in =
JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 获取日志管理器对象
LogManager logManager = LogManager.getLogManager();
// 通过日志管理器加载配置文件
logManager.readConfiguration(in);
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
logger.severe("severe");
logger.warning("warning");
logger.info("info");
1
2
3
4
5
6
7
8
9
10
11
12
剩余32页未读,继续阅读
费利普斯
- 粉丝: 10
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0