Logback无法找到外部属性文件资源

时间:2014-02-06 22:12:58

标签: jndi logback

我使用的是logback版本1.0.13。 要从logback读取外部属性资源,我使用了JNDI条目(在Tomcat上下文中定义):

...
<insertFromJNDI env-entry-name="java:comp/env/app.config.path" as="app.config.path" /> 
<property resource="${app.config.path}" />
....

问题:logback找不到我的JNDI资源:$ {app.config.path} = file:/// D:/temp/application.properties

ERROR in ch.qos.logback.core.joran.action.PropertyAction - Could not find resource [file:///D:/temp/application.properties]

不适用于其他网址,例如:file://D:/, file:/D:/, file:////D:/,...

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

正如Bidit Kumar指出的那样,文件方法也有效。在我的情况下,我有类似的问题,我的解决方案如下(我应用解决方案2)

解决方案:

  1. <property file="C:\myproject\src\main\resources\com\mycompany\app.properties"/>

  2. <property resource="\com\mycompany\app.properties"/>

答案 1 :(得分:1)

设置:

语言: Java

应用程序: Spring Boot应用程序

项目: Maven

记录:重新登录

容器:(用于开发的Jetty |用于生产的Tomcat)


情况:

在我们的项目中,资源根目录有logback.xml。该文件需要访问特定的应用程序属性。在下面的示例中,我们需要访问的属性为logging.home.dir,它将存储为LOGGER_HOME

示例:logback.xml

<configuration> 
  <property name="LOGGER_HOME" value="${logging.home.dir}" />

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOGGER_HOME}/application.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- other setting --> 
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <!-- other setting --> 
    </encoder>
  </appender>
</configuration>

问题:

通常,对于开发人员来说,可以使用默认的应用程序属性文件application.properties来保存所有必需的属性,但是对于生产而言,此文件已被外部化。

发展

application.properties
logging.home.dir=temp/logs/
  • 对于开发而言,只要application.proerties文件在类路径中可用,就可以使用<property resource="application.properties" />在logback.xml中对其进行引用

生产

Location: /opt/production/tc8-java8/my_wonderfull_app/application-prod.properties
application-prod.properties
logging.home.dir=application/logs/
  • 此文件位于应用外部。不幸的是,由于此文件不在类路径中,因此我们无法像在开发中一样加载该文件。

解决方案:

要允许登录使用外部属性文件,您需要执行以下操作:

步骤1::启动应用程序时,您需要添加一个VM选项,指示在何处加载外部属性文件: -Dmy.wonderful.app.external.properties.file=/opt/production/tc8-java8/my_wonderfull_app/application-prod.properties

步骤2:现在,您可以在登录文件中使用 <property file="${my.wonderful.app.external.properties.file}" /> <!-- note this MUST match the VM option name -->

<property name="LOGGER_HOME" value="${logging.home.dir}" /> <!-- property key from the file -->


简短答案:

应用程序VM选项

-D my.wonderful.app.external.properties.file = / opt / production / tc8-java8 / my_wonderfull_app / application-prod.properties

Logback.xml

<属性文件=“ $ {{my.wonderful.app.external.properties.file}”“ />


  

注1:对于Intellij,可以通过运行/调试配置> Spring Boot> [配置>环境>'VM选项:']

添加VM选项。      

注2:对于Tomcat,可以在/bin/setenv.sh中添加VM选项。   CATALINA_OPTS = -Dmy.wonderful.app.external.properties.file = / opt / production / tc8-java8 / my_wonderfull_app / application-prod.properties

答案 2 :(得分:0)

尝试使用file =“$ {app.config.path}”而不是resource =“$ {app.config.path}”

<强>

和$ {app.config.path} = D:/ ...

检查日志记录文档以获取更多详细信息:http://logback.qos.ch/manual/configuration.html

答案 3 :(得分:0)

SpringApplication在以下位置从application.properties文件加载属性,并将它们添加到Spring Environment:

  1. 当前目录的/ config子目录
  2. 当前目录
  3. 类路径/ config包
  4. classpath根

如果您不喜欢application.properties(在dev,stage,生产环境中希望与之不同的情况)作为配置文件名,则可以通过指定spring.config.name环境来切换到另一个文件名。属性。您还可以通过使用spring.config.location环境属性来引用显式位置

您可以尝试以下操作(Eclipse)

在运行配置中使用适当的值设置环境变量SPRING_CONFIG_LOCATION和SPRING_CONFIG_NAME。

enter image description here

在logback.xml中,添加以下属性

<property
        file="${SPRING_CONFIG_LOCATION}${SPRING_CONFIG_NAME}.properties" />

现在,您可以按以下方式访问属性文件中存在的属性(例如variablename.xyz)

<property name="MY_PROPERTY" value="${variablename.xyz}" />