slf4j/logback FileAppender在eclipse工作区中编写

fla*_*nze 6 java eclipse eclipse-rcp logback slf4j

我有一个使用slf4j/logbackeclipse RCP应用程序来捕获所有日志消息.

现在我配置了以下文件appender:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>softmodeler_client.log</file>
    <append>true</append>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>[%date] %level: %logger - %m%n</pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

这会将日志文件写入应用程序安装目录.
某些客户不允许在安装目录中进行写访问.
在这种情况下,我们重定向文件中定义以下内容的工作空间和配置目录Applicationname.ini:

-data
@user.home/AppData/Roaming/Applicationname/workspace
-configuration
@user.home/AppData/Roaming/Applicationname/configuration
Run Code Online (Sandbox Code Playgroud)

现在我想配置logback.xml这样的,将日志文件指向可写工作区目录:

<file>${osgi.instance.area}softmodeler_client.log</file>
Run Code Online (Sandbox Code Playgroud)

FileNotFoundException由于系统属性的file:/前缀,这导致a osgi.instance.area.没有协议,我没有找到另一个属性.

My question is how can I configure logback to write into my workspace, without having to modify the logback.xml every time?

EDIT:
Maybe I can register a listener from where I can set some initial properties?
I would prefer to use an existing system property or programmatically pass a variable to the logging framework. The goal is, not having to configure an additional parameter/variable for every installation (since quite a few and might be missed during updates). Just somehow automatically always write the log file into the workspace directory.

And*_*LDM 0

您应该考虑使用基于 groovy 的 logback 配置,如下所示:

import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.FileAppender
import static ch.qos.logback.classic.Level.DEBUG

def FILENAME = "file:///home/jdoe/app.log".replace("file://", "")

appender("FILE", FileAppender) {
  file = "${FILENAME}"
  append = true
  encoder(PatternLayoutEncoder) {
    pattern = "[%date] %level: %logger - %m%n"
  }
}

root(DEBUG, ["FILE"])
Run Code Online (Sandbox Code Playgroud)

您可能需要 groovy 运行时作为依赖项:

compile 'org.codehaus.groovy:groovy-all:2.4.6'

我不喜欢 OSGI,但我很确定有一种方法可以检索 ${osgi.instance.area} 属性并删除“file://”,如上所示,因为 Groovy 是一种成熟的语言。