热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java配置log4j日志文件路径(附-获取当前类路径的多种操作)

这篇文章主要介绍了Java配置log4j日志文件路径(附-获取当前类路径的多种操作),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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)”去除
 // 推荐: 使用“.getPath()”就可以直接获取到路径

 // 获取工程的绝对路径, 如: /Projects/KafkaConsumer,
 // 若在bin中通过java -jar等命令启动, 路径就变成了: /Projects/KafkaConsumer/bin
 System.out.println(System.getProperty("user.dir"));
}

补充知识:在web中使用log4j时,配置日志文件的存放位置

废话不多说,直接上代码。

log4j.properties配置如下

log4j.rootLogger = info,out1,out2
log4j.appender.out1=org.apache.log4j.FileAppender
log4j.appender.out1.File=test.log

log4j.appender.out1.layout=org.apache.log4j.PatternLayout
log4j.appender.out1.layout.COnversionPattern=%d %-5p - %m at %l%n

log4j.appender.out2=org.apache.log4j.ConsoleAppender
log4j.appender.out2.layout=org.apache.log4j.PatternLayout
log4j.appender.out2.layout.COnversionPattern=%d %-5p - %m at %l%n

问题一:这个test.log文件会存放在哪呢?

经测试发现,test.log这个相对路径相对的是user.dir系统参数的值。

假如我的tomcat的安装路径为D:\apache-tomcat-6.0.16,则user.dir=D:\apache-tomcat-6.0.16\bin,当不确定时,我们可以用System.getProperties()将所有的系统参数在jsp中打印出来。

问题二:

如果我们将test.log改为绝对路径/test.log,这个test.log文件又会存放在哪呢?

经测试发现,/test.log这个绝对路径的根路径是user.dir系统参数的根路径,即test.log会存放在D:\test.log。

补充:

我们在log4j.properties文件中还可以通过${系统参数}的方式来指明日志文件存放路径。

log4j.appender.out1.File=${user.dir}/logs/test.log

以上这篇Java 配置log4j日志文件路径 (附-获取当前类路径的多种操作)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 我正在使用sql-serverkafka-connect和debezium监视sqlserver数据库,但是当我发布并运行我的wo ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
author-avatar
假发cat时代
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有