目录
一、日志
1.什么是日志
(1)生活中的日志
(2)程序中的日志
2.日志和输出语句的对比
(1)输出语句
(2)日志
3.日志技术的特点
4.日志的体系结构
5.LogBack
(1)LogBack介绍
(2)主要技术模块
(3)使用步骤
(4)jar包获取
国外maven仓库(个人推荐~)
国内maven镜像
(5)导入jar包
(6)配置文件
(7)在代码中获取logback对象
(8)日志级别
①作用:将开发中不同的日志信息进行分类,只输出大于等于该级别的日志信息。
②级别
③说明
(9)配置文件
第一部分:控制台部分
第二部分:输出文件部分
第三部分:级别部分
二、枚举
1.枚举的必要性
2.枚举的作用
3.枚举的概念和格式
(1)概念
(2)格式
(3)特点
(4)枚举常用方法
好比日记可以记录生活的点点滴滴
程序中的日志可以用来记录程序在运行的情况。并可以进行永久存储.
取消日志:需要修改代码才可以完成(删除或注释掉)
输出位置:只能打印在控制台,不能将其记录到其他的位置 (文件,数据库),如果要记录到文件或数据库中还需要额外代码
多线程:需要与业务代码处于同一线程中,对业务代码有影响
取消日志:不需要修改代码
输出位置:可将日志信息输出到文件或数据库中
多线程:不影响业务代码
通过使用日志技术,我们可以控制日志信息输送的目的地是控制台、文件等位置。
我们也可以控制每一条日志的输出格式
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码.
其中Log4J由于有致命bug,很少用了
JUL性能比较低,也很少用
LogBack:目前用的最多的之一
Logback是基于slf4j的日志规范实现的框架,性能比之前使用的log4j要好。
logback-core: 该模块为其他两个模块提供基础代码,必须有
logback-classic: 完整实现了slf4j API的模块
logback-access :与 Tomcat 和Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能
导入Logback的相关jar包
编写Logback配置文件
在代码中获取日志的对象
按照级别设置记录日志信息
详细内容在下面找
https://mvnrepository.com/
阿里云:仓库服务
中央仓库:Central Repository:
网易:http://maven.netease.com/repository/public/
华为云:Index of maven-public
tencent:https://mirrors.cloud.tencent.com/repository/maven/
中国科技大学:http://mirrors.ustc.edu.cn/maven/maven2/
南京大学:http://maven.nju.edu.cn/repository/
清华大学:Central Repository:
北京理工大学:http://mirror.bit.edu.cn/maven/
东软信息学院:https://mirrors.neusoft.edu.cn/maven2/
中国科学院开源协会:http://maven.opencas.cn/maven/
北京交通大学:http://maven.bjtu.edu.cn/maven2/
由于还没有配置maven环境,就先手动下载!
需要的包名:
logback-core
logback-classic
slf4j-api
第一步:首先从上述网站中找到logback所需要的模块,把jar包下载下来
两种示例:
第一种:
点进去
这里我选的1.414版本,
第二种:阿里云
第二步:导包
之后右键jar包,选择add as library即可
在src目录下新建一个logback.xml文件
再将下面内容粘贴进去即可
通用级配置~
${log.pattern}
${log.charset}
${log.base}/info/${log.moduleName}_info.log
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n
${log.charset}
${log.base}/info/archive/${log.moduleName}_info_%d{yyyy-MM-dd}.%i.log.zip
60
${log.max.size}
INFO
ACCEPT
DENY
${log.base}/warn/${log.moduleName}_warn.log
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n
${log.base}/warn/archive/${log.moduleName}_warn_%d{yyyy-MM-dd}.%i.log.zip
60
${log.max.size}
WARN
ACCEPT
DENY
${log.base}/error/${log.moduleName}_error.log
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n
${log.base}/error/archive/${log.moduleName}_error_%d{yyyy-MM-dd}.%i.log.zip
60
${log.max.size}
ERROR
ACCEPT
DENY
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Scanner;
public class LockBackDemo {
/**
* 获取日志对象
*/
private static final Logger LOGGER = LoggerFactory.getLogger(LockBackDemo.class);
public static void main(String[] args) {
//写日志,类似输出语句
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串");
String s = scanner.nextLine();
LOGGER.info("用户输入的字符串为"+s);
System.out.println("请输入数字");
String numStr = scanner.nextLine();
try {
int n = Integer.parseInt(numStr);
LOGGER.info("用户输入格式正确"+numStr);
} catch (NumberFormatException e) {
LOGGER.info("用户输入格式不对"+numStr);
}
}
}
级别程度依次是:TRACE< DEBUG(默认)
默认级别是debug(忽略大小写),LOGGER.级别(“级别的信息”)
TRACE:使用非常少,直接过
DEBUG:打印基本信息,查看程序基本流程,常用来程序调试,企业项目上线之后,会取消DEBUG级别的日志
INFO:打印你感兴趣或认为重要的信息,如用户登录判断,记录用户登录失败的信息
WARN:警告级别,提示
ERROR:错误,已经发生了错误,但不影响程序正常运行,如catch异常处
FATAL:重大事故,会导致程序终止
还有两个特殊ALL和OFF,分别代表打开全部日志和关闭所有日志(不记录)
一共有三个部分,通用配置粘过来无非就修改三个部分
${log.pattern}
${log.charset}
${log.base}/info/${log.moduleName}_info.log
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n
${log.charset}
${log.base}/info/archive/${log.moduleName}_info_%d{yyyy-MM-dd}.%i.log.zip
60
${log.max.size}
INFO
ACCEPT
DENY
如果程序中需要几个固定值,如果用常量表示的话,会有如下几个问题
代码不够简洁
不同类型的数据是通过名字区分的
不安全。由于是数字类型,就有可能使用这几个值做一些运算操作
间接的表示一些固定的值,如:十二个月份,四季,周一到周日等等
是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。
和类类似
使用关键字enum
public enum Seasons{
//枚举项1,枚举项2,枚举项3
SPRING,SUMMER,AUTUMN,WINTER
}
所有枚举类都是Enum的子类
我们可以通过”枚举类名.枚举项名称”去访问指定的枚举项
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Seasons.SPRING);
}
public enum Seasons{
//枚举项1,枚举项2,枚举项3
SPRING,SUMMER,AUTUMN,WINTER
}
}
每一个枚举项其实就是该枚举的一个对象
枚举也是一个类,也可以去定义成员变量枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊
如果枚举项的后面无值,会默认调用该枚举类的空参构造
public enum Seasons{
//枚举项1,枚举项2,枚举项3
SPRING("春"),
SUMMER("夏"),
AUTUMN("秋"),
WINTER("冬");
// private Seasons(){
//
// }
private String name;
private Seasons(String name){
this.name = name;
}
}
枚举类也可以有抽象方法,但是枚举项必须重写该方法
如果枚举类中有抽象方法,在枚举项中必须全部实现
public enum Seasons{
//枚举项1,枚举项2,枚举项3
SPRING("春"){
@Override
void run() {
System.out.println(this.name);
}
},
SUMMER("夏"){
@Override
void run() {
System.out.println(this.name);
}
},
AUTUMN("秋"){
@Override
void run() {
System.out.println(this.name);
}
},
WINTER("冬"){
@Override
void run() {
System.out.println(this.name);
}
};
// private Seasons(){
//
// }
public String name;
private Seasons(String name){
this.name = name;
}
abstract void run();
}
方法名 | 说明 |
---|---|
String name() | 获取枚举项的名称 |
int ordinal() | 返回枚举项在枚举类中的索引值 |
int compareTo(E o) | 比较两个枚举项,返回的是索引值的差值 |
String toString() | 返回枚举常量的名称 |
static < T> T valueOf(class< T> type,String name ) | 获取指定枚举类中的指定名称的枚举值 |
values() | 获得所有枚举项 |
Seasons spring = Enum.valueOf(Seasons.class, "SPRING");
System.out.println(spring==Seasons.SPRING);