Java-网络编程基础02-日志,枚举

发布时间:2024年01月24日

目录

一、日志

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)枚举常用方法


一、日志

1.什么是日志

(1)生活中的日志
  • 好比日记可以记录生活的点点滴滴

(2)程序中的日志
  • 程序中的日志可以用来记录程序在运行的情况。并可以进行永久存储.

2.日志和输出语句的对比

(1)输出语句
  • 取消日志:需要修改代码才可以完成(删除或注释掉)

  • 输出位置:只能打印在控制台,不能将其记录到其他的位置 (文件,数据库),如果要记录到文件或数据库中还需要额外代码

  • 多线程:需要与业务代码处于同一线程中,对业务代码有影响

(2)日志
  • 取消日志:不需要修改代码

  • 输出位置:可将日志信息输出到文件或数据库中

  • 多线程:不影响业务代码

3.日志技术的特点

  • 通过使用日志技术,我们可以控制日志信息输送的目的地是控制台、文件等位置。

  • 我们也可以控制每一条日志的输出格式

  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

  • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码.

4.日志的体系结构

  • 其中Log4J由于有致命bug,很少用了

  • JUL性能比较低,也很少用

  • LogBack:目前用的最多的之一

5.LogBack

(1)LogBack介绍

Logback是基于slf4j的日志规范实现的框架,性能比之前使用的log4j要好。

(2)主要技术模块
  • logback-core: 该模块为其他两个模块提供基础代码,必须有

  • logback-classic: 完整实现了slf4j API的模块

  • logback-access :与 Tomcat 和Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能

(3)使用步骤
  • 导入Logback的相关jar包

  • 编写Logback配置文件

  • 在代码中获取日志的对象

  • 按照级别设置记录日志信息

详细内容在下面找

(4)jar包获取
国外maven仓库(个人推荐~)

https://mvnrepository.com/

国内maven镜像

阿里云:仓库服务

中央仓库: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/

(5)导入jar包

由于还没有配置maven环境,就先手动下载!

需要的包名:

  1. logback-core

  2. logback-classic

  3. slf4j-api

  • 第一步:首先从上述网站中找到logback所需要的模块,把jar包下载下来

两种示例:

第一种:

点进去

这里我选的1.414版本,

第二种:阿里云

  • 第二步:导包

之后右键jar包,选择add as library即可

  • 第三步:验证

  • 验证方式1:是否能够展开

  • 验证方式2:

    • File

    • Project Structure...

    • libraries

(6)配置文件

在src目录下新建一个logback.xml文件

再将下面内容粘贴进去即可

通用级配置~

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
 ? ?<!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
 ? ?<!-- 日志级别 -->
 ? ?<property name="log.root.level" value="info"/>
 ? ?<!-- 其他日志级别 -->
 ? ?<property name="log.other.level" value="info"/>
 ? ?<!-- 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->
 ? ?<property name="log.base" value="logs"/>
 ? ?<!-- 模块名称, 影响日志配置名,日志文件名 -->
 ? ?<property name="log.moduleName" value="2020-edge-barnacle-application"/>
 ? ?<!-- 日志文件大小 -->
 ? ?<property name="log.max.size" value="500MB"/>
 ? ?<!-- 定义日志输出格式-->
 ? ?<property name="log.pattern"
 ? ? ? ? ? ? ?value="%date{ISO8601} %-1level [%thread] %logger{56}.%method:%L -%msg%n"/>
 ? ?<property name="log.charset" value="UTF-8"/>
?
 ? ?<!--控制台输出 -->
 ? ?<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
 ? ? ? ?<!-- 用来定义日志的格式 -->
 ? ? ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 ? ? ? ? ? ?<pattern>${log.pattern}</pattern>
 ? ? ? ? ? ?<charset>${log.charset}</charset>
 ? ? ? ?</encoder>
 ? ?</appender>
?
 ? ?<!-- 日志文件输出 -->
 ? ?<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 ? ? ? ?<!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
 ? ? ? ?<file>${log.base}/info/${log.moduleName}_info.log</file>
 ? ? ? ?<!-- 日志输出的文件的格式  -->
 ? ? ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 ? ? ? ? ? ?<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
 ? ? ? ? ? ?<charset>${log.charset}</charset>
 ? ? ? ?</encoder>
 ? ? ? ?<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
 ? ? ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 ? ? ? ? ? ?<!--按天回滚-->
 ? ? ? ? ? ?<fileNamePattern>${log.base}/info/archive/${log.moduleName}_info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
 ? ? ? ? ? ?<!--日志最大存储天数-->
 ? ? ? ? ? ?<maxHistory>60</maxHistory>
 ? ? ? ? ? ?<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
 ? ? ? ? ? ?<maxFileSize>${log.max.size}</maxFileSize>
 ? ? ? ?</rollingPolicy>
 ? ? ? ?<!--过滤器,只记录INFO级别的日志-->
 ? ? ? ?<filter class="ch.qos.logback.classic.filter.LevelFilter">
 ? ? ? ? ? ?<level>INFO</level>
 ? ? ? ? ? ?<onMatch>ACCEPT</onMatch>
 ? ? ? ? ? ?<onMismatch>DENY</onMismatch>
 ? ? ? ?</filter>
 ? ?</appender>
?
 ? ?<!-- 日志文件输出 -->
 ? ?<appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 ? ? ? ?<!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
 ? ? ? ?<file>${log.base}/warn/${log.moduleName}_warn.log</file>
 ? ? ? ?<!-- 日志输出的文件的格式  -->
 ? ? ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 ? ? ? ? ? ?<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
 ? ? ? ?</encoder>
 ? ? ? ?<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
 ? ? ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 ? ? ? ? ? ?<fileNamePattern>${log.base}/warn/archive/${log.moduleName}_warn_%d{yyyy-MM-dd}.%i.log.zip
 ? ? ? ? ? ?</fileNamePattern>
 ? ? ? ? ? ?<!--日志最大存储天数-->
 ? ? ? ? ? ?<maxHistory>60</maxHistory>
 ? ? ? ? ? ?<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
 ? ? ? ? ? ?<maxFileSize>${log.max.size}</maxFileSize>
 ? ? ? ?</rollingPolicy>
 ? ? ? ?<filter class="ch.qos.logback.classic.filter.LevelFilter">
 ? ? ? ? ? ?<level>WARN</level>
 ? ? ? ? ? ?<onMatch>ACCEPT</onMatch>
 ? ? ? ? ? ?<onMismatch>DENY</onMismatch>
 ? ? ? ?</filter>
 ? ?</appender>
?
 ? ?<!-- 日志文件输出 -->
 ? ?<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 ? ? ? ?<!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
 ? ? ? ?<file>${log.base}/error/${log.moduleName}_error.log</file>
 ? ? ? ?<!-- 日志输出的文件的格式  -->
 ? ? ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 ? ? ? ? ? ?<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
 ? ? ? ?</encoder>
 ? ? ? ?<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
 ? ? ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 ? ? ? ? ? ?<fileNamePattern>${log.base}/error/archive/${log.moduleName}_error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
 ? ? ? ? ? ?<!--日志最大存储天数-->
 ? ? ? ? ? ?<maxHistory>60</maxHistory>
 ? ? ? ? ? ?<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
 ? ? ? ? ? ?<maxFileSize>${log.max.size}</maxFileSize>
 ? ? ? ?</rollingPolicy>
 ? ? ? ?<filter class="ch.qos.logback.classic.filter.LevelFilter">
 ? ? ? ? ? ?<level>ERROR</level>
 ? ? ? ? ? ?<onMatch>ACCEPT</onMatch>
 ? ? ? ? ? ?<onMismatch>DENY</onMismatch>
 ? ? ? ?</filter>
 ? ?</appender>
?
?
 ? ?<!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
 ? ?<logger name="org.springframework.aop.framework.CglibAopProxy" additivity="false">
 ? ? ? ?<level value="info" />
 ? ? ? ?<appender-ref ref="stdout" />
 ? ?</logger>
 ? ?<!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console -->
 ? ?<root level="info">
 ? ? ? ?<appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger -->
 ? ? ? ?<appender-ref ref="infoFile" />
 ? ? ? ?<appender-ref ref="warnFile" />
 ? ? ? ?<appender-ref ref="errorFile" />
 ? ?</root>
</configuration>
(7)在代码中获取logback对象
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);
 ? ? ?  }
 ?  }
}

(8)日志级别
①作用:将开发中不同的日志信息进行分类,只输出大于等于该级别的日志信息。
②级别
  • 级别程度依次是:TRACE< DEBUG(默认)<INFO<WARN<ERROR<FATAL

  • 默认级别是debug(忽略大小写),LOGGER.级别(“级别的信息”)

③说明
  • TRACE:使用非常少,直接过

  • DEBUG:打印基本信息,查看程序基本流程,常用来程序调试,企业项目上线之后,会取消DEBUG级别的日志

  • INFO:打印你感兴趣或认为重要的信息,如用户登录判断,记录用户登录失败的信息

  • WARN:警告级别,提示

  • ERROR:错误,已经发生了错误,但不影响程序正常运行,如catch异常处

  • FATAL:重大事故,会导致程序终止

  • 还有两个特殊ALL和OFF,分别代表打开全部日志和关闭所有日志(不记录)

(9)配置文件

一共有三个部分,通用配置粘过来无非就修改三个部分

第一部分:控制台部分

 ? ? ? 
?<!-- 用来定义日志的格式 -->
 ? ? ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- ? ? ? ? ? ?
 ? ? ? ? ? ?<!-格式化输出(可自定):%d表示日期,%thread表示线程名,%-5level: 级别从左显示5个字符宽度
 ? ? ? ? ? ?%msg: 日志消息,%n是换行符
 ? ? ? ? ? ?<pattern>%d{yyyy-MM-dd HH:mm:ss.sss] [%-5level] %c [%thread] : %msg%n</pattern>
 ? ? ? ? ? ?-->
 ? ? ? ? ? ?<pattern>${log.pattern}</pattern>
 ? ? ? ? ? ?<charset>${log.charset}</charset>
 ? ? ? ?</encoder>
 ? ?</appender>
第二部分:输出文件部分
<!-- 日志文件输出 -->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 ? ?<!-- 设置日志不超过${log.max.size}时的保存路径,注意:如果是web项目会保存到Tomcat的bin目录下 -->
 ? ?<file>${log.base}/info/${log.moduleName}_info.log</file>
 ? ?<!-- 日志输出的文件的格式  -->
 ? ?<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 ? ? ? ?<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
 ? ? ? ?<charset>${log.charset}</charset>
 ? ?</encoder>
 ? ?<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
 ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 ? ? ? ?<!--按天回滚-->
 ? ? ? ?<fileNamePattern>${log.base}/info/archive/${log.moduleName}_info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
 ? ? ? ?<!--日志最大存储天数-->
 ? ? ? ?<maxHistory>60</maxHistory>
 ? ? ? ?<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
 ? ? ? ?<maxFileSize>${log.max.size}</maxFileSize>
 ? ?</rollingPolicy>
 ? ?<!--过滤器,只记录INFO级别的日志-->
 ? ?<filter class="ch.qos.logback.classic.filter.LevelFilter">
 ? ? ? ?<level>INFO</level>
 ? ? ? ?<onMatch>ACCEPT</onMatch>
 ? ? ? ?<onMismatch>DENY</onMismatch>
 ? ?</filter>
</appender>
?

第三部分:级别部分
<!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console -->
<root level="info">
 ? ?<appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger -->
 ? ?<appender-ref ref="infoFile" />
 ? ?<appender-ref ref="warnFile" />
 ? ?<appender-ref ref="errorFile" />
</root>

二、枚举

1.枚举的必要性

如果程序中需要几个固定值,如果用常量表示的话,会有如下几个问题

  • 代码不够简洁

  • 不同类型的数据是通过名字区分的

  • 不安全。由于是数字类型,就有可能使用这几个值做一些运算操作

2.枚举的作用

  • 间接的表示一些固定的值,如:十二个月份,四季,周一到周日等等

3.枚举的概念和格式

(1)概念

是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

(2)格式

和类类似

使用关键字enum

public enum Seasons{
 ? ? ? ?//枚举项1,枚举项2,枚举项3
 ? ? ? ?SPRING,SUMMER,AUTUMN,WINTER
 ?  }
(3)特点
  • 所有枚举类都是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();
 ?  }

(4)枚举常用方法
方法名说明
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);

文章来源:https://blog.csdn.net/qq_33627452/article/details/135737259
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。