1-日志框架
介绍 : 程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。
-
生活中的日志: 生活中的日志就好比日记,可以记录你生活的点点滴滴。
引入 :
-
目前输出语句的弊端 :
-
信息只能展示在控制台
-
不能将其记录到其他的位置(文件,数据库)
-
想取消记录的信息需要修改代码才可以完成
-
-
日志技术的具体优势
输出语句 | 日志技术 | |
---|---|---|
输出位置 | 只能是控制台 | 可以将日志信息写入到文件或者数据库中 |
取消日志 | 需要修改代码,灵活性比较差 | 不需要修改代码,灵活性比较好 |
多线程 | 性能较差 | 性能较好 |
-
日志体系结构
JCL : Jakarta Commons Logging
Jakarta : Apache基金旗下的开源Java项目社区
Logback 快速入门
-
官网 : Logback Home
-
三个技术模块
模块名 | 介绍 |
---|---|
logback-core: | 该模块为其他两个模块提供基础代码,必须有。 |
logback-classic: | 完整实现了slf4j API的模块。 |
logback-access | logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能 |
使用步骤
第一步 : 引入 jar 包
jar 包 : 本质来说是压缩包, 内部存储的都是别人已经写好的代码
在项目下新建一个文件夹lib,与src同级,将上述三个jar包复制到lib文件夹中,右键lib,选择Add as Library...
第二步:导入配置文件
将logback.xml文件复制到模块的src文件下
第三步:获取日志对象使用
package com.lyl.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogDemo1 {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger("lyl");
logger.info("生成一个日志");
}
}
日志级别和配置文件详解
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>D:/TestprojectCode/lyl-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/TestprojectCode2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
默认debug,打印输出只输出当前级别及以上
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
通过logback.xml 中的<appender>标签可以设置输出位置和日志信息的详细格式。
通常可以设置2个日志输出位置:一个是控制台、一个是系统文件中
2-枚举
-
枚举是Java中的一种特殊类型
-
枚举的作用:“是为了做信息的标志和信息的分类”。
定义枚举类的格式
public enum 枚举名 {
枚举项1,枚举项2,枚举项3;
}
注意: 定义枚举类要用关键字enum
示例代码
// 定义一个枚举类,用来表示春,夏,秋,冬这四个固定值
public enum Season {
SPRING,SUMMER,AUTUMN,WINTER;
}
枚举的特点【理解】
所有枚举类都是 Enum 的子类
我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
每一个枚举项其实就是该枚举的一个对象
枚举也是类, 可以定义成员变量
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
枚举类可以有构造器,但必须是 private 的,它默认的也是 private 的。
枚举项的用法比较特殊:枚举("");
枚举类也可以有抽象方法,但是枚举项必须重写该方法
示例代码
public enum Season {
SPRING("春"){
//如果枚举类中有抽象方法
//那么在枚举项中必须要全部重写
@Override
public void show() {
System.out.println(this.name);
}
},
SUMMER("夏"){
@Override
public void show() {
System.out.println(this.name);
}
},
AUTUMN("秋"){
@Override
public void show() {
System.out.println(this.name);
}
},
WINTER("冬"){
@Override
public void show() {
System.out.println(this.name);
}
};
public String name;
//空参构造
//private Season(){}
//有参构造
private Season(String name){
this.name = name;
}
//抽象方法
public abstract void show();
}
public class EnumDemo {
public static void main(String[] args) {
//我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.AUTUMN);
System.out.println(Season.WINTER);
//每一个枚举项其实就是该枚举的一个对象
Season spring = Season.SPRING;
}
}
问题:我们可以选择常量做信息标志和分类,为什么还要选择枚举做信息标志和分类?
回答:常量虽然可以实现可读性,但是入参值不受约束,代码相对不够严谨;而用枚举,代码的可读性更好,入参约束严谨,代码优雅,是最好的信息分类技术!建议使用!
-
枚举 : 可以理解是一种多例设计模式
单例设计模式: 保证类的对象, 在内存中只有一份
枚举 : 保证类的对象, 在内存中, 只有固定的几个