java--如何将自己封装的sdk中的log4j2日志,改成让使用sdk的人在他自己的项目中,通过配置文件来指定sdk的日志保存路径、日志名称、日志级别等

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目录下

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值