log4j.xml引用Javaweb项目中配置文件的参数

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

由于最近用阿里云日志服务整合log4j,在配置com.aliyun.openservices.log.log4j.LoghubAppender需要设置一些参数,因为项目中有统一的配置文件,所以想要可以直接在log4j.xml中通过${}来获取参数,参考下面的配置。

<appender name="AliyunSLS" class="com.aliyun.openservices.log.log4j.LoghubAppender"><param name="projectName" value="${Props.Log4j.AliyunSLS.projectName}"/><!-- 日志服务的project名,必选参数 --><param name="logstore" value="${Props.Log4j.AliyunSLS.logstore}"/><!-- 日志服务的logstore名,必选参数 --><param name="endpoint" value="${Props.Log4j.AliyunSLS.endpoint}"/><!-- 日志服务的http地址,必选参数 --><param name="accessKeyId" value="${Props.Log4j.AliyunSLS.accessKeyId}"/><!-- 用户身份标识,必选参数 --><param name="accessKey" value="${Props.Log4j.AliyunSLS.accessKey}"/><!-- 用户身份标识,必选参数 --><param name="packageTimeoutInMS" value="${Props.Log4j.AliyunSLS.packageTimeoutInMS}"/><!-- 被缓存起来的日志的发送超时时间,如果缓存超时,则会被立即发送,单位是毫秒,默认值为3000,最小值为10,可选参数 --><param name="logsCountPerPackage" value="${Props.Log4j.AliyunSLS.logsCountPerPackage}"/><!-- 每个缓存的日志包中包含日志数量的最大值,不能超过 4096,可选参数 --><param name="logsBytesPerPackage" value="${Props.Log4j.AliyunSLS.logsBytesPerPackage}"/><!-- 每个缓存的日志包的大小的上限,不能超过 3MB,单位是字节,可选参数 --><param name="memPoolSizeInByte" value="${Props.Log4j.AliyunSLS.memPoolSizeInByte}"/><!-- Appender 实例可以使用的内存的上限,单位是字节,默认是 100MB,可选参数 --><param name="maxIOThreadSizeInPool" value="${Props.Log4j.AliyunSLS.maxIOThreadSizeInPool}"/><!-- 指定I/O线程池最大线程数量,主要用于发送数据到日志服务,默认是8,可选参数 --><param name="retryTimes" value="${Props.Log4j.AliyunSLS.retryTimes}"/><!-- 指定发送失败时重试的次数,如果超过该值,会把失败信息通过log4j的LogLog进行输出,默认是3,可选参数 --><param name="topic" value="${Props.Log4j.AliyunSLS.topic}"/><!-- 指定日志主题,可选参数 --><!--<param name="source" value="Props.Log4j.AliyunSLS.source"/>--><!-- 指定日志来源,可选参数 --><param name="timeFormat" value="${Props.Log4j.AliyunSLS.timeFormat}"/><!-- 设置时间格式,可选参数 --><param name="timeZone" value="${Props.Log4j.AliyunSLS.timeZone}"/><!-- 设置时区,可选参数 --><param name="Threshold" value="${Props.Log4j.AliyunSLS.Threshold}"/><!-- 输出WARN级别及以上的消息 --></appender>

log4j.xml中通过${}引用的变量是系统变量,即通过System.getProperty()获取,显然这里我们只需要将我们需要的变量设置到系统变量中即可,第一种方法就是在启动的时候指定系统变量,这种方法不方便,每次启动都要手动输入变量的值。第二种就是我们只要确保在日志服务启动前将参数设置到系统变量中就可以了。这里介绍一种通过自定义LoggerFactory的方式来实现。

通过查看源码知道,log4j在解析log4j.xml的时候最先解析的是<loggerFactory/>节点,该节点代表的是日志生成工厂接口org.apache.log4j.spi.LoggerFactory,代码如下:

package org.apache.log4j.spi;import org.apache.log4j.Logger;public interface LoggerFactory {Logger makeNewLoggerInstance(String var1);
}

默认情况下,log4j会加载LoggerFactory的默认实现类org.apache.log4j.DefaultCategoryFactory,代码如下:

package org.apache.log4j;import org.apache.log4j.spi.LoggerFactory;class DefaultCategoryFactory implements LoggerFactory {DefaultCategoryFactory() {}public Logger makeNewLoggerInstance(String name) {return new Logger(name);}
}

DefaultCategoryFactory.makeNewLoggerInstance(name)直接生成Logger,需要注意的是Logger的构造方法是受保护的,也就是我们没办法在其他包中通过new Logger(name)来生成一个Logger实例,代码如下:

public class Logger extends Category {private static final String FQCN;protected Logger(String name) {super(name);}...
}

由源码可以看出,LoggerFactory的实现非常简单,接下来看一下如何实现。

 

1、由于Logger的构造方法是受保护的,所以我们只要通过自定义Logger子类,就可以使用Logger的功能了

public class Log4jLogger extends Logger {public Log4jLogger(String name) {super(name);}
}

2、实现LoggerFactory接口

public class Log4jLoggerFactory implements LoggerFactory {private static final String LOG4J_PROPERTY_PREFIX_KEY = "log4jPropertyPrefix";//默认以Props.Log4j.开头的参数加载到系统变量中private static final String DEFAULT_LOG4J_PROPERTY_PREFIX = "Props.Log4j.";static {loadLog4jPropsToSystem();}//加载参数到系统变量中//PropertiesUtils由系统自定义的获取配置文件的工具类,根据自己的需要自行实现private static void loadLog4jPropsToSystem() {//如果配置了log4jPropertyPrefix,则以该参数作为参数开头标识String prefixsParam = PropertiesUtils.getStringValue(LOG4J_PROPERTY_PREFIX_KEY);String[] prefixs = null;if (StringUtil.isNotBlank(prefixsParam)) {prefixs = prefixsParam.split(",");} else {prefixs = new String[] {DEFAULT_LOG4J_PROPERTY_PREFIX};}//获取所有系统配置文件信息Map<Object, Object> allProperties = PropertiesUtils.getAllProperties();if (allProperties != null && !allProperties.isEmpty()) {for (Map.Entry<Object, Object> e : allProperties.entrySet()) {String key = e.getKey().toString();for (String pf : prefixs) {if (key.startsWith(pf)) {System.setProperty(key, e.getValue().toString());System.out.println("Set log4j property[" + key + "=" + e.getValue().toString() + "] into System. ");break;}}}}}@Overridepublic Logger makeNewLoggerInstance(String name) {return new Log4jLogger(name);}}

3、在log4j.xml中配置自定义LoggerFactory,<loggerFactory/>配置在最前面

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'><!-- 自定义log4j日志生成工厂,可以加载配置文件中参数设置到系统参数中,默认加载以Props.Log4j.开头的参数,可以通过log4jPropertyPrefix配置加载哪些参数,有多个的话用逗号分隔 --><loggerFactory class="自己的包路径.Log4jLoggerFactory"/>...
</log4j:configuration>

到这里就完毕了,配置文件中的参数就可以给log4j.xml使用了。

转载于:https://my.oschina.net/linchuhao23/blog/2248889

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

砂 即懒且忙 只有随笔

B同学说&#xff1a;砂&#xff0c;你已经好久没更新你的博了。是啊&#xff0c;我即懒且忙。上周六爬了青云山&#xff0c;公司组织的。一直懒得处理照片。拍了将近300张的照片&#xff0c;可到现在也就才弄了那么几张。我自恋。照片是自拍的。娘说&#xff1a;天呐&#xff0…

精通Spring Boot——第十一篇:使用自定义配置

2019独角兽企业重金招聘Python工程师标准>>> 今天这篇文章给大家介绍自定义配置的两种方式 第一式&#xff1a; 使用ConfigurationProperties&#xff0c;且看代码 package com.developlee.customconfig.config;import org.springframework.boot.context.properties…

MySQL 高可用架构在业务层面的应用分析

MySQL 高可用架构在业务层面的应用分析 http://mp.weixin.qq.com/s?__bizMzAxNjAzMTQyMA&mid208312443&idx1&snf9a0d03dd9a1cf3b3575c0241291e421&scene22&srcidseLU5tmZumKLzwVBIHzM#rd http://mp.weixin.qq.com/s?__bizMzAxNjAzMTQyMA&mid20831244…

数据结构与算法学习笔记之 从0编号的数组

数据结构与算法学习笔记之 从0编号的数组前言数组看似简单&#xff0c;但掌握精髓的却没有多少&#xff1b;他既是编程语言中的数据类型&#xff0c;又是最基础的数据结构&#xff1b;一个小问题&#xff1a;为什么数据要从0开始编号&#xff0c;而不是 从1开始呢&#xff1f;正…

Windows 故障转移+Hyper-V 虚机自动迁移高 可用

Windows 故障转移Hyper-V 虚机自动迁移高 可用 Windows 故障转移Hyper-V 虚机自动迁移高... 1一、系统原理... 31.1 高效率的 VMbus 架构... 31.2 完美支持 Linux 系统... 4二、架构拓朴... 52.1 网络及系统架构拓朴... 52.2 域结构拓朴... 5三、实验资源列表... 63.1 网络设备…

MSSqlServer基础学习01

1.新建登陆用户名&#xff0c;须赋予数据库访问权限方可访问已有的数据库&#xff0c;可以参考如下图片转载于:https://www.cnblogs.com/MyVision/p/11242417.html

javascript删除数组,索引出现问题解决办法。

var data [{ isRemove: 0, name: "项目1" },{ isRemove: 1, name: "项目2" },{ isRemove: 1, name: "项目3" },{ isRemove: 0, name: "项目4" },{ isRemove: 0, name: "项目5" },{ isRemove: 0, name: "项目6" }…

Mircosoft 正式把Windows Mobile改名为Windows Phone,你会因此而购买Windows Phone吗?

简介 本文讲述Windows Phone改名事件&#xff0c;以及Windows Phone发展历史和今后发展策略的想法。 事件 今天下班的时候看报纸&#xff0c;有一段新闻关于昨天(2009年10月6日)Mircosoft正式使用Windows Phone这个名字。我去到原先Windows Mobile的主页&#xff0c;已经全部由…

Linux 下, npm i 老是被killed 已杀死

2019独角兽企业重金招聘Python工程师标准>>> node&#xff1a;v8.12.0 npm v6.4.1 npm i 安装到一半会报这样到错误&#xff0c;并终止&#xff1a; npm WARN deprecated socks1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious …

phpstudy-5.6.27-nts  安装redis扩展

2019独角兽企业重金招聘Python工程师标准>>> redis扩展安装流程 第一步&#xff1a; 首先直接查看一下phpinfo()的信息 找到下面两条信息 Architecturex86PHP Extension BuildAPI20131226,NTS,VC11Loaded Configuration FileD:\phpStudy\php\php-5.6.27-nts\php.ini…

用DDA Convolution和Perlin Noise来模拟水粉画笔触

在西方&#xff0c;水彩画和水粉画是可以统称为Watercolor的,水粉画通常也称为不透明水彩画或树胶水彩画&#xff08;Gouache&#xff09;&#xff0c;两者既有相似之处&#xff0c;又有所区别。水粉画是以水作为媒介&#xff0c;这一点&#xff0c;它与水彩画是相同的。所以&a…

刺猬文│从启动方式来看播客链的运行机制—设置验证者

&#xff08;图片出自网络&#xff0c;版权归原作者所有&#xff09;上一篇刺猬文我们介绍了播客链是如何实现Dpos的&#xff0c;其实质过程就是&#xff1a;节点A打包&#xff0c;将打包的区块发送给其它的节点&#xff0c;其它节点根据当前时间&#xff0c;判断是否应该由A节…

[记忆碎片的磁盘整理]老妈

卷标&#xff1a;老妈 挂载点&#xff1a;/family/mother 分区格式&#xff1a;亲情 备注&#xff1a;老妈固然是我人生中的至亲&#xff0c;但是搜遍我的大闹&#xff0c;也没能发现一点关于老妈的特殊记忆。老妈是一位再普通不过的女人、妻子、母亲。也本该如此吧。碎片文件&…

探究Java如何实现原子操作(atomic operation)

1. 让我们首先了解下java 中 Volatile 关键字 Volatile可实现java内存模型当中的可见性&#xff0c; java内存模型的可见性&#xff1a; 可见性&#xff0c;是指线程之间的可见性&#xff0c;一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果&#xff0c;另一…

Password Creator(HTA)

<!--- 功能&#xff1a; 生成随机密码- 输入&#xff1a; 用户的设置- 输出&#xff1a; 随机密码&#xff0c;同时拷贝到剪切板- 作者&#xff1a; maskx- 版本&#xff1a; v1.0- 历史纪录&#xff1a; 2007-7-11新建 - 创建时间&#xff1a; 200…

Julia 排坑指南

Julia 是一个高效的计算语言&#xff0c;据说性能和C有一拼。 Google也开始支持TPU的Julia&#xff0c; 个人觉得他的可视化比较厉害&#xff0c;下面是自己安装过程的截图&#xff0c;由于Julia的服务器在国外&#xff0c;所以下载的过程会出现一些不可描述的问题&#xff0c;…

Windows Server 2016之RDS配置证书

证书我们可以自己创建也可以到阿里云申请&#xff0c;一次申请可以用一年&#xff0c;&#xff08;自己创建的证书是不受信任的&#xff09;所以我们在阿里云上申请的&#xff0c;下面我们就把申请到的证书下载下来&#xff0c;放到一个文件夹里&#xff0c;并解压接下来我们就…

2018阿里云双11拼团大促主会场全攻略

为什么80%的码农都做不了架构师&#xff1f;>>> 摘要&#xff1a; 在双十一这个一年唯一一次的大幅度降价促销日&#xff0c;怎样才能花最少的钱配置最特惠的云服务&#xff1f;云栖社区特为各位开发者奉献出省钱大法如下&#xff01; 2018阿里云双十一拼团大促活动…

匿名用户访问用发布站点模板创建网站的列表项时要求登录的问题解决

因为发布站点中的一个Feature被打开了&#xff0c;造成将列表FormPage的查看给Lock了&#xff0c;所以需要登录&#xff0c;将其关闭就OK了。哈哈。英文KB&#xff1a;Users are unexpectedly prompted to enter their credentials when they access a list in a Windows Share…

知识点1: 进度条随数据变化,并添加渐变样式

效果图&#xff1a; dom&#xff1a; //  进度条             <div class"progress" :style"styleObj1"><div class"point"></div></div>//  数据容器<div class"precent"><counte…