【问题标题】:Loading properties file from WEB-INF folder in a log4j appender从 log4j appender 中的 WEB-INF 文件夹加载属性文件
【发布时间】:2011-12-14 08:17:52
【问题描述】:

我们正在为我们的应用程序编写一个自定义 log4j 附加程序。 appender 应该将其事件记录到数据库中。现在我遇到的问题是设置数据库连接。我们的 jdbc 设置位于名为 jdbc.properties 的文件中,该文件直接位于 WEB-INF 文件夹下。

我尝试使用以下代码访问属性文件

InputStream stream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("jdbc.properties");

...但流导致为空。有什么想法可以从 log4j appender 中的 WEB-INF 文件夹中加载属性文件而不将属性文件移动到另一个位置?

【问题讨论】:

  • 我认为这将在 WEB-INF/classes 目录中查找属性文件。一个类似的问题:stackoverflow.com/questions/1108434/…
  • 我知道,因此关于不移动文件的评论。
  • 问题是,appender被使用了,例如,当服务器启动时,所以没有会话,也没有绑定到应用程序。

标签: java properties log4j classloader


【解决方案1】:

也许你可以试试,

 String  path =Thread.currentThread().getContextClassLoader().getResource("/").toURI().resolve("../jdbc.properties").getPath();
 Properties ps=new Properties();
 ps.load(new FileInputStream(path));

【讨论】:

  • appender是一个独立类,只扩展了AppenderSkeleton,没有getServletContext()方法。我真的必须创建一个将上下文存储在静态变量中的 ServletContextListener 吗?
  • @KimL - 当然!你也可以在你的类的实例方法中使用this.getClass().getResource("/").toURI().resolve("../jdbc.properties").toString()
【解决方案2】:

您应该能够通过 ServletContext 获取文件。即:

ServletContext ctx = ...
InputStream stream = ctx.getResourceAsStream("/WEB-INF/jdbc.properties"); 

好的,刚刚看到,您无权访问 ServletContext - 忘记答案。

不可以将jdbc连接的信息加入log4j.properties吗?你为什么要把两者分开?

【讨论】:

  • 因为应用程序的其余部分正在使用 jdbc.properties 文件。不想在两个地方有相同的配置。
猜你喜欢
  • 2014-12-07
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多