log4j2自定义参数动态打印到日志中,解决配置文件只能写死参数的问题

本文介绍了如何在log4j2中自定义参数并动态地将其打印到日志中,避免了在配置文件中写死参数的问题。通过四个步骤:更新pom.xml引入高版本log4j2以修复安全漏洞,创建Log4jProperties文件,配置log4j2.properties,并在启动类中进行相应调整,实现了参数动态打印的功能。

第一步:配置pom文件,引入log4j2,因为低版本log4j有漏洞,因此引入高版本

<!--修改parent版本号 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath />
</parent>
   <!--在properties中加入log4j2.version的版本号 -->
   <properties>
          <log4j2.version>2.18.0</log4j2.version>
   </properties>
 
    <!--移除其它log4j,引入log4j2的几个包-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>

第二步:conf目录添加 Log4jProperties 文件

例如这个工程路径
代码如下

public class Log4jProperties{
    public static void reloadLog4j() {
		//例如我要在log4j2的配置文件中,加入如下的值
		//这些值可以做一些代码处理,比如做md5、值运算等等,这样就可以解决配置文件只能写死的问题
        System.setProperty("envir", "envir");// 部署环境
        System.setProperty("appName", "appName");// 工程名
        System.setProperty("fileNameMd5", "fileNameMd5");// 文件名
        System.setProperty("rechargeEnv", "active");//活动
    }

第三步:配置log4j2.properties

由于高版本log4j2可使用properties来进行配置,这里便采用此种文件类型,放到resources路径下,注意必须是log4j2这个名字

#log4j系统参数,不用动
status = error

#修改控制台日志级别,打包前改成fatal,TRACE < DEBUG < INFO < WARN < ERROR < FATAL
property.CONSOLE_LOG_LEVEL=info
#日志文件保存路径需根据工程部署位置修改路径
property.LOG_HOME=/app/elk/logs/

#log4jProperties里的参数,通过这种方式获取
property.envir=${sys:envir}
property.appName=${sys:appName}
property.fileNameMd5=${sys:fileNameMd5}
property.rechargeEnv=${sys:rechargeEnv}

#系统日志级别不用动
property.OUTPUT_LOG_LEVEL=trace
property.BACKUP_HOME=backup
property.EVERY_FILE_SIZE=10M
property.FILE_MAX=10

# 日志要发到什么地方,控制台
appender.console.type = Console
# 本appender的名字,以便在Logger的配置项中能够调用
appender.console.name = STDOUT
#过滤器,过滤日志的级别
appender.console.filter.threshold.level = ${CONSOLE_LOG_LEVEL}
#过滤类型
appender.console.filter.threshold.type = ThresholdFilter
# 输出格式类型
appender.console.layout.type = PatternLayout
# 输出格式,不设置默认为 %m%n
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %5p ${appName} ${envir} %c{1}:%L - %m%n 

# 采用RollingFile类型的Appender
appender.rollingFile.type=RollingFile
# 本appender的名字,以便在Logger的配置项中能够调用
appender.rollingFile.name=RollingFileAll
#过滤器,过滤日志的级别,可根据要保存的日志级别修改,建议不动
appender.rollingFile.filter.threshold.level = info
#过滤类型
appender.rollingFile.filter.threshold.type = ThresholdFilter
# 当前正在操作的日志文件的文件名
appender.rollingFile.fileName=${LOG_HOME}/${appName}_new_${fileNameMd5}.log
# 归档后的日志文件的文件名格式,其中`%d{yyyy-MM-dd}`用来自动填充日期,这里配置到天就是按天归档,配置到小时就是按小时归档
appender.rollingFile.filePattern=${LOG_HOME}/${appName}_old_${fileNameMd5}.log.%d{yyyy-MM-dd}
# 启用Layout配置
appender.rollingFile.layout.type=PatternLayout
# 对应输出的每条日志的日志头
appender.rollingFile.layout.pattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p ${appName} ${envir} %c{1}:%L - %m%n 
# 启用Policy配置,指定滚动日志的策略
appender.rollingFile.policies.type=Policies
# 基于时间进行日志的切割,根据filePattern配置的日期格式而定
appender.rollingFile.policies.time.type=TimeBasedTriggeringPolicy
# 切割的间隔单位为1, 根据filePattern配置的日期格式归档
appender.rollingFile.policies.time.interval=1
# 修正时间范围,0时开始计数
appender.rollingFile.policies.time.modulate=true
#基于文件大小进行日志的切割
#appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
#文件大小
#appender.rolling.policies.size.size=${EVERY_FILE_SIZE}
#配置Strategy用来删除过多的日志归档文件
#appender.rolling.strategy.type=DefaultRolloverStrategy

#错误日志配置
appender.error.type=RollingFile
appender.error.name=RollingFileError
appender.error.filter.threshold.level = error
appender.error.filter.threshold.type = ThresholdFilter
appender.error.fileName=${LOG_HOME}/error/${appName}/${appName}_error_${fileNameMd5}.log
appender.error.filePattern=${LOG_HOME}/error/${appName}/history/${appName}_old_error_${fileNameMd5}.log.%d{yyyy-MM-dd}
appender.error.layout.type=PatternLayout
appender.error.layout.pattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p ${appName} ${envir} %c{1}:%L - %m%n 
appender.error.policies.type=Policies
appender.error.policies.time.type=TimeBasedTriggeringPolicy
appender.error.policies.time.interval=1
appender.error.policies.time.modulate=true
#appender.error.policies.size.type=SizeBasedTriggeringPolicy
#appender.error.policies.size.size=${EVERY_FILE_SIZE}
#appender.error.strategy.type=DefaultRolloverStrategy

# 用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。一般是项目包名或者框架的包名,单独对这个处理
#logger.activity.name = com.cu.indenture.config
# 设置日志级别
#logger.activity.level = debug
# 是否向上级logger传递信息
#logger.activity.additivity = false
# 关联名称为RollingFileAll的输出源(appender)
#logger.activity.appenderRef.all.ref = RollingFileAll
#logger.activity.appenderRef.error.ref = RollingFileError
#logger.activity.appenderRef.stdout.ref = STDOUT


#日志级别,不用动
rootLogger.level = ${OUTPUT_LOG_LEVEL}
#用来指定该日志输出到哪个 Appender
rootLogger.appenderRef.stdout.ref = STDOUT
#用来指定该日志输出到哪个 Appender
rootLogger.appenderRef.all.ref = RollingFileAll
#用来指定该日志输出到哪个 Appender
rootLogger.appenderRef.error.ref = RollingFileError

第四步:修改启动类

注意不要再启动类里使用private final static Logger logger = LoggerFactory.getLogger(XXXXX.class);

public class IndentureApplication extends SpringBootServletInitializer {
    //不要在启动类里添加private final static Logger logger = LoggerFactory.getLogger(XXXXX.class);
    static {
    	//在这里加载Log4jProperties,将自定义参数注入进去
        Log4jProperties.reloadLog4j();
    }
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder.sources(this.getClass());
        return super.configure(builder);
    }
    public static void main(String[] args) {
        SpringApplication.run(IndentureApplication.class, args);
        //不要打印日志,否则会生成两个日志文件
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值