Java - 自动配置log4j的日志文件路径
2019-08-16 12:01:53来源:博客园 阅读 ()
Java - 自动配置log4j的日志文件路径
目录
- 1 日志路径带来的痛点
- 2 log4j.properties文件的配置
- 3 彻底解决痛点
- 3.1 单独的Java程序包 (非Java Web项目)
- 3.2 Web项目
- 4 附录 - 获取当前项目、类路径的几种方式
1 日志路径带来的痛点
Java 项目中少不了要和log4j等日志框架打交道, 开发环境和生产环境下日志文件的输出路径总是不一致, 设置为绝对路径的方式缺少了灵活性, 每次变更项目路径都要修改文件, 目前想到的最佳实现方式是: 根据项目位置自动加载并配置文件路径.
本文借鉴 Tomcat 的配置方式 “${catalina.home}/logs/catalina.out”, 通过相对路径的方式设置日志的输出路径, 有其他解决方案的小伙伴, 请直接评论区交流哦??
2 log4j.properties文件的配置
# 设置要输出的日志的级别 - 注意: properties文件中的注释信息只能处于行首, 不要跟在行尾
log4j.rootLogger=INFO,stdout,logfile
### 输出到控制台, Java程序运行时的标准输出信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 2019-05-25 19:09:46
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] - %m%n
### 输出到日志文件
# 按天滚动生成, 不支持MaxFileSize, 而RollingFileAppender支持
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
# 项目的logs目录下
# log4j.appender.logfile.File=${base.dir}/logs/elastic-server.log
log4j.appender.logfile.Append=true
# 输出INFO及以上的日志, 按日期滚动就无须配置单个日志文件的最大体积了
log4j.appender.logfile.Threshold=INFO
# log4j.appender.logfile.MaxFileSize=100MB
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] - %m%n
3 彻底解决痛点
3.1 单独的Java程序包 (非Java Web项目)
单独的Java程序包, 需要通过命令java -jar
或java -cp
的方式启动;
我们可以在启动命令中加入系统运行时变量, 在log4j加载配置文件之前通过System.getProperties("path")
读取此变量, 即可实现灵活加载当前路径.
(1) 启动脚本设置:
假设当前项目的目录结构为:
/Projects/KafkaConsumer
丨 bin 项目的启动脚本
丨 conf 项目的配置文件
丨 lib 项目的其他依赖包
丨 bogs 项目的日志输出路径
启动脚本位于bin目录下, 内容示例如下:
# 获取当前脚本所处的目录, 然后进入其上级目录, 最后pwd输出该目录, 最终的结果是/Project/KafkaConsumer
base_dir=$(cd `dirname $0`; cd ..; pwd)
# 获取Java运行程序的位置, 并指定主类
java_bin=$(which java)
main_class="org.shoufeng.elastic.ConsumerMain"
# 通过-cp、扩展CLASSPATH、指定主类的方式启动项目,
# 并通过“-D”的方式向此程序的运行时环境中设置当前项目的路径,
# 即可在程序中通过System.getProperty("base.dir")获取此路径
nohup ${java_bin} -Dbase.dir=${base_dir} -cp ${CLASSPATH}:${base_dir}/conf:${base_dir}/lib/* ${main_class} >> /dev/null &
(2) Java程序读取变量:
实log4j的FileAppender本身支持动态设置文件路径, 如:
log4j.appender.logfile.File=${base.log}/logs/app.log
其中“${base.log}”是一个变量, 会被System Property
中的base.log
的值代替, 代码中的使用方式为:
public static void main(String[] args) {
// 获取系统运行时变量中的日志文件的输出路径
// 此变量需要在启动命令中通过-D的方式设置
String baseDir = System.getProperty("base.dir");
if (baseDir == null) {
// 开发环境中使用
baseDir = System.getProperty("user.dir");
System.setProperty("base.dir", baseDir);
}
log.info("==== 系统运行路径: " + System.getProperty("base.dir") + " ====");
// 其他处理逻辑......
}
需要注意的是, 这种方式设置的环境变量只在当前Java进程(也就是当前项目)中有效, 并不会影响到其他项目.
3.2 Web项目
如果是Web项目, 可通过修改Web容器的环境变量方式实现. 以 Tomcat 为例:
# log4j的配置文件支持服务器的vm环境变量, 格式类似${catalina.home}
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=100MB
${catalina.home}
是在${tomcat_home}/bin/catalina.sh
中通过-D参数设置的:
-Dcatalina.home="$CATALINA_HOME"
基于这个思路, 我们也可以向Web容器的VM参数中设置一个参数, 比如-Dmylog.home="/Project/logs"
, 创建日志对象时即可使用.
4 附录 - 获取当前项目、类路径的几种方式
public static void main(String[] args) {
// 获取 class 文件的绝对路径, 定位到具体的包名, 结果如:
// /Projects/KafkaConsumer/target/classes/org/shoufeng/consumer/
System.out.println(KafkaConsumer.class.getResource(""));
// 获取 class 文件的绝对路径, 如: /Projects/KafkaConsumer/target/classes/,
// 如果在bin目录下通过java -jar等命令启动时, 结果就是 /Projects/KafkaConsumer/bin/
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(KafkaConsumer.class.getResource("/"));
System.out.println(KafkaConsumer.class.getClassLoader().getResource(""));
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
// 说明: 上述4种用法的返回结果类型都是URL, 其toString()返回的内容以"file:"开头, 可通过“.toString().substring(5)”去除
// 获取工程的绝对路径, 如: /Projects/KafkaConsumer,
// 若在bin中通过java -jar等命令启动, 路径就变成了: /Projects/KafkaConsumer/bin
System.out.println(System.getProperty("user.dir"));
}
参考资料
log4j 产生的日志位置设置 和 catalina.home、catalina.base
版权声明
作者: 瘦风(https://healchow.com)
出处: 博客园 瘦风的博客(https://www.cnblogs.com/shoufeng)
感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶??] 或 [推荐??] 吧??
本文版权归博主所有, 欢迎转载, 但 [必须在文章页面明显位置标明原文链接], 否则博主保留追究相关人员法律责任的权利.
原文链接:https://www.cnblogs.com/shoufeng/p/11310086.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:基础篇-1.5Java的数组
下一篇:Java考题知识点
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash