fla*_*nze 6 java eclipse eclipse-rcp logback slf4j
我有一个使用slf4j/logback的eclipse 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.
您应该考虑使用基于 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 是一种成熟的语言。