LOG4J2 显示 Hibernate 日志和开发中的我的日志,但仅显示来自已安装 MSI 的 Hibernate 日志(JavaFX 22 使用 Maven 和 jpackage for MSI)

问题描述 投票:0回答:1

我的 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

javafx log4j2 jpackage
1个回答
0
投票

@jewelsea
我在启动使用maven-shade生成的fat jar时也遇到同样的情况,所以这不是jpackage问题。

我使用 ClassLoader.getResourceAsStream() 方法将配置文件作为流加载。该方法旨在从类路径加载资源,包括jar文件内的资源。

try (InputStream inputStream = Log.class.getResourceAsStream(ResourcesPaths.getCONFIG_LOGBACK_PATH())) {
    configurator.doConfigure(inputStream);
...
© www.soinside.com 2019 - 2024. All rights reserved.