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,一经查实,立即删除!

相关文章

……

快疯了快疯了…… 我无非是想找人说话。已经几天没有讲话了。 转载于:https://www.cnblogs.com/belial/archive/2007/04/13/711429.html

时间换算单位

时钟周期是一个时间的量&#xff0c;人们规定10纳秒&#xff08;ns&#xff09;为一个时钟周期。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率。对于PC100规格的内存来说&#xff0c;它的运行时钟周期应该不高于10纳秒。纳秒与工作频率之间的…

砂 即懒且忙 只有随笔

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

.Net Core创建Docker镜像

1、.Net Core项目【Lails.Server.Demo】发布到目录下Lails.Server.Demo\bin\Release\netcoreapp2.1\publish2、上面目录下新建文件Dockerfile&#xff1a;# 父镜像FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base# 设置工作目录WORKDIR /app# 复制发布文件到/app下COPY …

[原]变参函数原理详解

/*变参函数原理说明:va_start就是求得第一个可变参的地址.下面几个宏的作用:保是来确定可变参数的列表中每个参数的地址.实现变参函数的要点,就是想办法取得每个参数的地址.*/#include <stdio.h> #include <stdarg.h>#if 0#define va_list void*#define va_arg(arg…

Web服務器的配置方法

Web服務器的配置方法 一、 安裝IIS 1. 進入[控制面板]-[新增/移除Windows元件]&#xff0c;勾選Internet Information Servers(IIS)如圖&#xff0c;在安裝過程中需要插入windows操作系統光盤2. 建立虛擬目錄 右擊[我的電腦]--管理&#xff0c;找到[…

2018年开发者生态体系状态调查报告(第一部分)

在2018年年初&#xff0c;jetbrains公司通过调查6000名开发者来了解开发者的生态状态&#xff0c;最近&#xff0c;调查结果终于整理完毕&#xff0c;以下是得出的结果。一、 日常工作1.1&#xff09;流行语言&#xff1a;今年&#xff0c;使用最受欢迎、最常用与最有前途的语言…

面向对象三大基本特性,五大基本原则

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是&#xff1a;封装,继承,多态 所谓封装&#xff0c;也就是把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff0c;对不可信的进行信息隐藏。封装是…

人事薪资管理系统V1.00功能简介(适用于工厂)c#.net+SQL Server2000

1. 统计管理1.1 工厂员工综合统计1.2 按月统计生产订单总金额1.3 按月统计员工工资1.4 按月统计员工计件工资1.5 员工生日排行榜2. 人事管理2.1 增加员工信息2.2 上传或更换员工照片2.3 确认员工基本薪资&#xff08;含包月&#xff0c;计件&#xff0c;计…

运维工程师主要工作是做什么?

总结两句话&#xff1a; 1、保障业务长期稳定运行&#xff08;如网站服务器、游戏服务器等&#xff09;。 2、保障数据安全可靠&#xff08;如用户名密码、游戏数据、博客文章、交易数据等&#xff09;。 由这两句话推演运维工程师要学些什么&#xff1f; 一、保障业务长期稳定…

python3.7 安装cx_Freeze

遇到的问题简单描述&#xff1a; 1&#xff0c;直接 pip install cz_freeze 安装失败 2&#xff0c;pip cx_Free-*.*.*.tar.gz 安装失败 解决办法&#xff1a; 1&#xff0c;下载 cx_Freeze-5.1.1-cp37-cp37m-win_amd64.whl &#xff08;地址&#xff1a;https://www.lfd.uci…

SiteMesh参考

SiteMesh参考 作者&#xff1a;kongxx (kongxxgmail.com)安装 首先从sitemesh下载安装包&#xff0c;这里使用的是2.2.1版本。 创建一个Web应用程序&#xff0c;这里我创建一个名为myapp的Web应用程序&#xff1b; 复制sitemesh-2.2.1.jar文件到{myapp}/WEB-INF/lib目录下&am…

精通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…

使用Expresso学习.net正则表达式

什么是RE?想必各位大大在做文件查找的时侯都有使用过万用字符”*”&#xff0c;比如说想查找在Windows目录下所有的Word文件时&#xff0c;你可能就会用”*.doc”这样的方式来做查找&#xff0c;因为”*”所代表的是任意的字符。RE所做的就是类似这样的功能&#xff0c;但其功…

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

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

JAVA四种基本排序总结

JAVA四种基本排序,包括冒泡法,插入法,选择法,SHELL排序法.其中选择法是冒泡法的改进,SHELL排序法是 插入法的改进.所以从根本上来说可以归纳为两种不同的排序方法:即:插入法&#xff06;冒泡法一 插入法:遍历排序集合&#xff0c;每到一个元素时&#xff0c;都要将这个元素与所…

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

js,java时间处理

1.JS获取时间格式为“yyyy-MM-dd HH:mm:ss”的字符串 function getTimeStr(){var myDate new Date();var year myDate.getFullYear(); //获取完整的年份(4位,1970-????)var month myDate.getMonth(); //获取当前月份(0-11,0代表1月)month month > 9 ? month : &quo…