我的 LOG4J2 日志在开发中可见,但在生产中通过 MSI 安装应用程序时不再可见。 在这两种情况下,Hibernate 日志都会记录在正确的文件中(路径在配置文件中指定)。
这是我的 log4j2.xml 配置文件:
<Configuration status="INFO" name="2024Log4j2Config">
<Properties>
<Property name="LOG_DIR">${sys:logs}</Property>
</Properties>
<Appenders>
<RollingFile
name="RollingFile"
fileName="${LOG_DIR}/app.log"
filePattern="${LOG_DIR}/app.%d{yyyy-MM-dd--HH-mm}--%i.log.gz"
ignoreExceptions="false">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="5 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${LOG_DIR}">
<IfFileName glob="app.*.log.gz"/>
<IfLastModified age="P30D"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
</Root>
<Logger name="org.hibernate" level="DEBUG" additivity="false">
<Appender-ref ref="RollingFile" level="DEBUG"/>
</Logger>
<Logger level="INFO" name="fr.bla.fx2024" additivity="false">
<Appender-ref ref="RollingFile" level="INFO"/>
</Logger>
</Loggers>
</Configuration>
我的 Java Log 类代码:
/**
* Set the default logs' path inside a logs system property
*/
private void setCurrentDefaultLogsPathInALog4j2SystemProperty() {
System.setProperty("logs", logsFolderPath);
}
/**
* Set the current Log4j2 configuration file's path
*/
private void setCurrentLog4j2ConfigurationFilePath() {
String log4j2ConfigurationPath = Objects.requireNonNull(this.getClass().getResource(ResourcesPaths.getCONFIG_LOG4J2_PATH())).toExternalForm();
Configurator.initialize("2024Log4j2Config", log4j2ConfigurationPath);
}
我注意到 getCONFIG_LOG4J2_PATH() 路径在开发和生产中是不同的,但我不明白 Hibernate 如何找到它并向其写入数据,特别是如何解决这一点:
Dev:文件:/C:/Users/MyUser/.../log4j2.xml
产品:jar:文件:/C:/Program%20Files/MyOrganization/app/MyApp.jar!/fr/bla/fx2024/config/log4j2.xml
@jewelsea
我在启动使用maven-shade生成的fat jar时也遇到同样的情况,所以这不是jpackage问题。
我使用 ClassLoader.getResourceAsStream() 方法将配置文件作为流加载。该方法旨在从类路径加载资源,包括jar文件内的资源。
try (InputStream inputStream = Log.class.getResourceAsStream(ResourcesPaths.getCONFIG_LOGBACK_PATH())) {
configurator.doConfigure(inputStream);
...