Log4j日志处理-----长文

51 篇文章 2 订阅
本文介绍了如何使用log4j解决SpringBoot应用中日志文件过大导致磁盘空间被占满的问题。通过配置log4j,限制日志大小并设置滚动策略,可以有效管理日志,防止日志文件无限增长。同时,提供了log4j的配置步骤和不同日志输出方式的示例。
摘要由CSDN通过智能技术生成

问题:解决springBoot,等java语言,存放至服务器导致日志越来越大,以至于占满整个磁盘的问题。

 测试服务,突然挂掉,为什么?

仔细一看,磁盘满了,上图为修复后的,当时可用为0,已用为100%。通过挨个ll -h发现

日志文件居然持续写入到了7个T。才3天没见就7个T了。删除后,停用程序恢复正常。


解决方式:通过log4j(日志管理工具),对程序的所有日志进行管理,只保留新日志。

log4j使用方法

一、引入jar包

咱们要使用它,那么肯定得先有log4j,下面为log4j的pom依赖(推荐用1,2目前有严重漏洞)

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

二、配置文件

1.创建配置文件

在maven项目中resources下,创建一个lo4j.properties的文件

然后我这边写了个初始化的类,用于帮助他找到配置文件(打成jar包后,建议将日志文件单独存存放在jar外头)

package com.example.log4jstudydemo.sa12;

import org.apache.log4j.PropertyConfigurator;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class InitLogRecord {
    public static void initLog() {
        FileInputStream fileInputStream = null;
        try {
            Properties properties = new Properties();
            fileInputStream = new FileInputStream("src/main/resources/log4j.properties");
            properties.load(fileInputStream);
            PropertyConfigurator.configure(properties);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    }

2.配置文件编写

直接复制可用

# 设置
log4j.rootLogger = stdout,E,LogFile

# 输出信息到控制台
log4j.appender.LogFile = org.apache.log4j.RollingFileAppender
log4j.appender.LogFile.layout = org.apache.log4j.PatternLayout
#log4j.appender.LogFile.File =E://logs/log.log
log4j.appender.LogFile.File =/hadoop/logs/car_log.log
log4j.appender.LogFile.Append = true
log4j.appender.LogFile.Threshold = INFO
log4j.appender.LogFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
log4j.appender.LogFile.Encoding=UTF-8
log4j.appender.LogFile.MaxFileSize=10kb
log4j.appender.LogFile.MaxBackupIndex=3


# 输出ERROR 级别以上的日志到文件E://logs/error.log
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.E.File =E://logs/error.log
log4j.appender.E.File =/hadoop/logs/car_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

代码中使用(执行的代码中)

InitLogRecord.initLog();
Logger log1 = Logger.getLogger(TDengineGPS.class);
log1.info("请求的结果"+respnseJsonCar);

输出方式 :

         org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志) 
         org.apache.log4j.ConsoleAppender (控制台)  
         org.apache.log4j.FileAppender (文件) 
         org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件) 
         org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方) 
 

百分比的含义:

            %c      输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的位置(如:"org.apache.elathen.ClassName",%C{2}将输出elathen.ClassName) 
            %d       输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss} 
            %l        输出日志事件发生位置,包括类目名、发生线程,在代码中的行数 
            %n       换行符 
            %m      输出代码指定信息,如info(“message”),输出message 
            %p       输出优先级,即 FATAL ,ERROR 等 
            %r        输出从启动到显示该log信息所耗费的毫秒数 
            %t        输出产生该日志事件的线程名
 

下列举例实际场景

专门给大伙,创建了一个springBoot的项目用来一起学习。

场景1:将日志打印到控制台。

(1)配置:\是换行

#表示log4j的输出目标(我这里有个stdout,代表的是我第4、5行等含他的配置会被使用)
log4j.rootLogger=DEBUG, stdout
# 下面2行是打印到控制台(console)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#定义log4j的格式,d%为时间后面的括号为具体时间
#%数字p为输出优先级(DEBUG,INFO,WARN,ERROR,FATAL)
#[%t]代表的是哪个线程产生的这个日志(在main方法里面跑的就是主线程) 后面的-是字符串
#%m代表具体输出的日志"log.info(这里面就是m的内容)",n%代表换行
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}\
  \ %4p [%t] - %m%n

(2) 代码:


@SpringBootApplication
public class Log4jStudyDemoApplication {
    public static Logger log1 = Logger.getLogger("log1");
    public static void main(String[] args) {
        SpringApplication.run(Log4jStudyDemoApplication.class, args);
//        核心,初始化类调用(告诉他,log4j是哪个配置文件)
        InitLogRecord.initLog();
//        创建log对象

//        打印
        log1.info("hahaha");
        log1.error("sss");
        
        //如果你要捕获异常则
    try(){
        代码
    }catch(Exception e){
        log1.error(e.getMessage());
    }

    }

}

场景2:将日志打印到日志文件中

1.首先定义1个名称,我的叫做LOGFILE

2.上一个场景的配置文件中的加1个LOGFILE

3.在添加下面的配置

#下面2行是打印到文件中
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
#将你的日志文件输送在哪个地方
log4j.appender.LOGFILE.File=E:\\mylog.log
#输出的日志类型
log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss}\
  -%l-%L-%m%n

 场景3:滚动日志(将日志写入多个文件,并且做限制)

#下面2行是打印到文件中(并且采用滚动模式)
log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
#将你的日志文件输送在哪个地方,如果有新生产的文件,则会叫mylog.log1
#以此类推,直到,你下面设置的maxBackUpIndex到上限,就会只保留最新
log4j.appender.LOGFILE.File=E:\\mylog.log
#输出的日志类型
log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss}\
  -%m%n
#指定编码格式,防止在linux,输出的中文错误有问题
log4j.appender.LOGFILE.Encoding=UTF-8
#指定超过这个大小则,生成1个新的日志文件
log4j.appender.LOGFILE.MaxFileSize=10kb
#指定日志文件个数,当超过这个数,则会替换掉以前的文件,只保留新的日志文件
log4j.appender.LOGFILE.MaxBackupIndex=3

2021年12月27日,补充

linux系统和idea中的不一样,切记打包后要单独指向这个配置文件。

另外,避免多余的

我这里的输出目标,依次是DEBUG模式,控制台,文件输出。

只保留LOGFILE(你需要的) ,其他如果你没有配置则会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值