1、介绍
由于近期工作需要,我需要自己动手封装一个存储功能的sdk,我构建的项目是普通的maven项目。
因为我在sdk中加入了日志的功能,一开始是在sdk中把log4j的日志配置好的,但是因为这个sdk还需要给其他业务使用,所以需要由使用者自己指定日志的配置信息。
2、我使用的版本和工具
idea:2021.3.3版本
jdk:1.8版本
log4j2:引入的依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.1</version>
</dependency>
3、具体实现:
3.1、先把log42j的依赖导入
3.2、新建一个日志工厂类,用来获取日志对象、和通过读取外部的配置文件来配置日志信息
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.*;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder;
import java.io.InputStream;
import java.util.Properties;
/**
* 日志工厂
*
* @author ning
* @since 2023/4/14 16:05
*/
public class LogFactory {
//定义一个日志对象
private static Logger LOGGER;
//构造私有
private LogFactory() {
}
//获取日志对象
public static Logger getLogger() {
if (LOGGER==null){
LOGGER=init();
}
return LOGGER;
}
//实例化日志对象
public static Logger init() {
//定义一个记录器
Logger log = null;
try {
//输入流获取指定文件名的内容
InputStream inputStream = LogFactory.class.getClassLoader().getResourceAsStream("log4j.properties");
Properties properties = new Properties();
properties.load(inputStream);
//配置构造器,用来配置日志
ConfigurationBuilder<BuiltConfiguration> builder = new CustomConfigurationBuilder();
//定义构造器名
builder.setConfigurationName("MyConfig");
// 添加应用程序日志记录器
AppenderComponentBuilder appenderBuilder = builder.newAppender("rolling", "RollingFile");
//properties.getProperty("logFilePath"),根据括号中的key值,在指定的配置文件中获取value值
//定义日志保存路径,第一个日志文件会保存到log.log文件中
appenderBuilder.addAttribute("fileName", properties.getProperty("logFilePath") + "/log.log");
//定义日志名称,这里是以时间为文件名,例:log-2023.5.19.log
//-%i:表示如果生成了多个同名的文件,会自动以i的值来区分,i自加,例:log-2023.5.19-1.log
appenderBuilder.addAttribute("filePattern", properties.getProperty("logFilePath") + "/log-%d{yyyy-MM-dd}-%i.log");
//定义日志记录的格式
LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout");
layoutBuilder.addAttribute("pattern", properties.getProperty("logFormat"));
appenderBuilder.add(layoutBuilder);
//定义按照文件大小判断是否生成新的文件,单位可以是 KB、MB、GB 或 TB
ComponentBuilder<?> triggeringPolicyBuilder = builder.newComponent("Policies")
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", properties.getProperty("fileMaxSize") + "MB"));
//添加按时间轮转的策略,每天产生一个新的日志文件
//这个和上边的按照文件大小生成新的文件共同生效,二者满足一个就会生成新的文件
triggeringPolicyBuilder.addComponent(builder.newComponent("TimeBasedTriggeringPolicy")
.addAttribute("interval","1")
.addAttribute("modulate","true"));
appenderBuilder.addComponent(triggeringPolicyBuilder);
//设置保留的日志数,也就是要保留几天的日志
ComponentBuilder<?> rollingPolicyBuilder = builder.newComponent("DefaultRolloverStrategy")
.addAttribute("max", properties.getProperty("maxBackupIndex"));
appenderBuilder.addComponent(rollingPolicyBuilder);
//把应用程序日志记录器添加到构造器中
builder.add(appenderBuilder);
//设置日志记录的级别:DEBUG、INFO、WARNING、ERROR、CRITICAL
LoggerComponentBuilder loggerBuilder = builder.newLogger(LogFactory.class.getName(),
Level.toLevel(properties.getProperty("logLevel")));
loggerBuilder.add(builder.newAppenderRef("rolling"));
builder.add(loggerBuilder);
//配置器初始化
Configurator.initialize(builder.build());
// 构建已配置的记录器
log= LogManager.getLogger(LogFactory.class); // 以给定名称获取记录器
} catch (Exception e) {
LOGGER.error("日志含义初始化log4j配置失败:"+e.getMessage());
}
return log;
}
}
//自定义配置器
class CustomConfigurationBuilder extends DefaultConfigurationBuilder {
public CustomConfigurationBuilder() {
super();
}
}
3.3、根据你在日志工厂类中指定的配置文件名,新建一个配置文件
最后生成的日志文件就是这样的:
需要注意的是,这个配置文件需要写到:resources目录下