【JAVA基础】日志使用详解

【JAVA基础】日志使用详解

​ 当进行Springboot开发时,我么需要使用控制台的输出消息来打印一些错误信息或者一些变量的临时值,在开发的初期经常会使用到System.out.println()来在控制台中输出,但是这种方式也存在一定的问题,当输出台中的调试信息过多时,我们总不能很快的得到要我们想得到的信息,所以这时候就可以用到今天使用到的Slf4j日志组件。

1.设计模式

​ Slf4j作为一个Springboot框架,使用到了设计模式当中的外观模式,这一个设计模式的主要思想就是将子系统的复杂性进行抽象和封装,客户端就能通过一个简单的接口,来访问子系统,不需要了解子系统的具体实现细节。

比如说, 电脑的例子其实能理解一点,

电脑整机是CPU、内存、硬盘的外观。有了外观以后,启动电脑和关闭电脑都简化了。直接new一个电脑。在new电脑的同时把cpu、内存、硬盘都初始化好并且接好线。对外暴露方法(启动电脑,关闭电脑)。

  • 启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
  • 关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU

2.Slf4j日志使用

SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。

即我们可以使用Slf4j日志框架来调用其他的日志框架来实现不同风格的日志。

用简单的话来说就是:在项目中使用了slf4j记录日志,并且绑定了log4j,即导入相应的依赖,则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将log4j替换成logback即可,不用修改项目中的代码。

3.Slf4j使用

3.1导入依赖

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>1.6.4</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.6.4</version>
</dependency>
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
</dependency>

3.2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </appenders>
    <loggers>
        <!--我们只让这个logger输出trace信息,其他的都是error级别-->
        <!--
        additivity开启的话,由于这个logger也是满足root的,所以会被打印两遍。
        不过root logger 的level是error,为什么Bar 里面的trace信息也被打印两遍呢
        -->
        <logger name="cn.lsw.base.log4j2.Hello" level="trace" additivity="false">
            <appender-ref ref="Console"/>
        </logger>
        <root level="error">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>
(1)根节点configuration

​ 有两个属性:status,monitorinterval,两个子节点:Appenders和Loggers表名可以定义多个Appender和Logger

​ status,用来指定log4j本身的打印日志级别 OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL

​ monitorinterval 重新读取配置文件的监测间隔时间,单位是s,最小是5s.

(2)Properties

​ 属性(可选),用来定义常量(例如日志打印的模版),之后在其他配置项中通过${变量名}引用

(3)Appenders

​ 常见的有三种子节点:Console、RollingFile、File

Console

​ 用来定义输出到控制台的Appender两个属性:name、target,一个节点:PatternLayout

​ name(属性):指定Appender的名字
​ target(属性):SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
​ PatternLayout(节点):指定输出日志的格式,可以使用pattern属性与Properties中定义的日志打印模板常量相结合,控制日志输出的模版,不设置则默认为:%m%n

File

​ 文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/info.log)

name(属性)::指定Appender的名字.
fileName(属性):指定输出日志的目的文件带全路径的文件名.
PatternLayout(节点):输出格式,不设置默认为:%m%n.

RollingFile

​ 也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则
​ 这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。

​ name(属性):指定Appender的名字.
​ fileName(属性):指定输出日志的目的文件带全路径的文件名
​ PatternLayout(节点):输出格式,不设置默认为:%m%n
​ filePattern:指定新建日志文件的名称格式.
​ Policies(节点):指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy(节点):Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
SizeBasedTriggeringPolicy(节点):Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy(节点):用来指定同一个文件夹下最多有几个日志文件时开始删除最l旧的,创建新的(通过max属性);可以指定压缩级别(通过compressionLevel属性),compressionLevel的值通常是一个介于0到9之间的整数,其中:0表示无压缩,1表示最快的压缩速度(但压缩率最低),9表示最高的压缩率(但压缩速度最慢)
Delete:清理旧日志文件的策略;basePath指定了日志文件所在的基目录;maxDepth用于指定清理或删除日志文件时搜索的目录深度,值是一个整数,表示从basePath开始向下搜索的目录层级数
IfFileName:Delete子节点,用于匹配要删除的文件名模式。glob接受一个通配符模式,用来匹配文件名。
IfLastModified:Delete子节点,用于检查文件的最后修改时间,并基于该时间点决定文件是否应该被清理或删除;age指定了文件最后修改时间与当前时间之间最大允许的时间差
​ 如果maxDepth=“0”,则只会考虑basePath所指向的目录本身,不包括任何子目录。

                    如果maxDepth="1",则会考虑basePath所指向的目录及其直接子目录。

                    如果maxDepth="2",则会考虑basePath所指向的目录、其直接子目录以及这些子目录下的子目录(即二级子目录)。
(4)Logger

​ Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。level:日志输出级别,共有8个级别,按照从低到高为: All < Trace < Debug < Info < Warn < Error < Fatal < OFF

root :设定根日志的日志级别
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出。
additivity:是否继承root节点,默认是true继承。默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
这里参考了

3.3打印日志

package com;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class TestConfigApplication {
	private static final Logger logger = LoggerFactory.getLogger(TestConfigApplication.class);
	public static void main(String[] args) {
		SpringApplication.run(TestConfigApplication.class, args);
		logger.error("这是error信息");
		logger.warn("这是warn信息");
		logger.info("这是info信息");
		logger.debug("这是debug信息");
	}
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微的小红猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值