问题:解决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(你需要的) ,其他如果你没有配置则会报错。