当前位置: 首页 > 知识库问答 >
问题:

文件中的log4j2配置

黄弘深
2023-03-14

我正在使用log4j的现有系统上工作,我想更新到log4j2。

有一个自定义Springbean从文件加载配置。我需要保持这种方法。我不能使用"log4j.configuration文件"系统属性。

我们有一个属性文件,其中指定了当前log4j.xml的路径(NFS共享)

Springbean有以下代码。。。

public class Log4jConfigurationBean implements ResourceLoaderAware,
    InitializingBean {

private ResourceLoader resourceLoader;

private boolean enabled;

private String location;

/**
 * Default, no argument constructor.
 */
public Log4jConfigurationBean() {
    enabled = true;
}

/**
 * Sets whether or not this bean should load an external configuration
 * defined by {@link #setLocation(Resource)}. If <code>false</code>, this
 * bean does nothing.
 * 
 * <p>
 * Default value is <code>true</code>.
 * </p>
 * 
 * @param enabled
 *            <code>false</code> causes this bean to do nothing
 */
public void setEnabled(final boolean enabled) {
    this.enabled = enabled;
}

/**
 * Sets the location of the external log4j configuration (xml or properties)
 * to be loaded.
 * 
 * @param location
 *            the location of the external configuration to be loaded.
 * @throws IllegalStateException
 *             if there is a problem resolving the location resource
 * @throws NullPointerException
 *             if <code>resource</code> is <code>null</code>
 */
public void setLocation(final String location) {
    this.location = StringUtils.trimToNull(location);
}

@Override
public void setResourceLoader(final ResourceLoader resourceLoader) {
    this.resourceLoader = resourceLoader;
}

/**
 * @throws IllegalStateException
 *             if enabled and no location has be set, or if the external
 *             configuration is neither xml or properties.
 */
@Override
public void afterPropertiesSet() throws Exception {
    URL configURL = null;
    if (null != location) {
        try {
            final Resource resource = resourceLoader.getResource(location);
            if (null != resource) {
                configURL = resource.getURL();
            }
        } catch (IOException e) {
            throw new IllegalArgumentException(
                    "Could not resolve configuration location due to error: ",
                    e);
        }
    }
    if (enabled && null == configURL) {
        throw new IllegalStateException(
                "Log4j configuration enabled, but configuration location is not set.");
    }
    if (enabled) {
        if (configURL.getFile().toLowerCase().endsWith(".xml")) {
            DOMConfigurator.configure(configURL);
        } else if (configURL.getFile().toLowerCase()
                .endsWith(".properties")) {
            PropertyConfigurator.configure(configURL);
        } else {
            throw new IllegalStateException(
                    "Configuration must be properties or xml: "
                            + configURL.getFile());
        }
    }
}

}

在log4j2中,没有PropertyConfiguration。如何加载log4j2。xml文件也是这样。

log4j2.xml文件的文件路径在Spring属性文件中指定。

目标是让war文件在类路径中包含一个log4j2.xml文件。这将在您的本地框上开发时使用。

当Web应用部署到qa环境时,会有一个属性文件,其中包含以下键/值对...

# Should an external file be used for log4j configuration
log4j.enabled=true
log4j.location=file:/paht to log4j2.xml

Springbean正在使用这些值来确定是否存在外部log4j2。应该使用xml文件,而不是类路径上的文件。

我尝试了这样的Springbean...代码被执行,但它仍然使用类路径上的配置文件。

public class Log4j2ConfigurationBean implements ResourceLoaderAware, InitializingBean {
private static final Logger log = LoggerFactory.getLogger(Log4j2ConfigurationBean.class);
private ResourceLoader resourceLoader;
private boolean enabled;
private String location;

/**
 * Default, no argument constructor.
 */
public Log4j2ConfigurationBean() {
    enabled = true;
}

/**
 * Sets whether or not this bean should load an external configuration defined by {@link #setLocation(Resource)}. If <code>false</code>, this bean does nothing.
 * 
 * <p>
 * Default value is <code>true</code>.
 * </p>
 * 
 * @param enabled
 *            <code>false</code> causes this bean to do nothing
 */
public void setEnabled(final boolean enabled) {
    this.enabled = enabled;
}

/**
 * Sets the location of the external log4j configuration (xml or properties) to be loaded.
 * 
 * @param location
 *            the location of the external configuration to be loaded.
 * @throws IllegalStateException
 *             if there is a problem resolving the location resource
 * @throws NullPointerException
 *             if <code>resource</code> is <code>null</code>
 */
public void setLocation(final String location) {
    this.location = StringUtils.trimToNull(location);
}

@Override
public void setResourceLoader(final ResourceLoader resourceLoader) {
    this.resourceLoader = resourceLoader;
}

/**
 * @throws IllegalStateException
 *             if enabled and no location has be set, or if the external configuration is neither xml or properties.
 */
@Override
public void afterPropertiesSet() throws Exception {
    URL configURL = null;
    if (enabled) {
        if (StringUtils.isBlank(location)) {
            throw new IllegalStateException("Log4j2 configuration enabled, but configuration location is not set.");
        }
        try {
            System.out.println(this.getClass().getName() + " : Loading log4j2 configuration with " + location);
            final Resource resource = resourceLoader.getResource(location);
            if (null != resource) {
                configURL = resource.getURL();
            }
        } catch (IOException e) {
            throw new IllegalArgumentException("Could not resolve configuration location due to error: ", e);
        }
        if (configURL.getFile().toLowerCase().endsWith(".xml")) {
            try {
                System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
                System.setProperty("AsyncLogger.RingBufferSize", "8192");
                ConfigurationFactory configurationFactory = XmlConfigurationFactory.getInstance();
                ConfigurationSource configurationSource = new ConfigurationSource(configURL.openStream(), configURL);
                Configuration configuration = configurationFactory.getConfiguration(configurationSource);
                configuration.start();
                log.info("Log4j2 configured with {}", location);
                log.info("System property Log4jContextSelector set to {}", System.getProperty("Log4jContextSelector"));
                log.info("System property AsyncLogger.RingBufferSize set to {}", System.getProperty("AsyncLogger.RingBufferSize"));
            } catch (Exception e) {
                System.out.println(this.getClass().getName() + " : Could not initialize log4j2 with resource " + location);
                System.out.println(e.getStackTrace());
            }
        } else {
            throw new IllegalStateException("Configuration must be xml: " + configURL.getFile());
        }
    } else {
        System.out.println(this.getClass().getName() + " : External log4j2 configuration not configured.");
    }
}

}

谢谢

共有1个答案

宣原
2023-03-14

查看如何在没有配置文件的代码中配置log4j2?本节-http://logging.apache.org/log4j/2.x/faq.html

 类似资料:
  • 最近,我决定学习如何使用log4j2记录器。我下载了所需的jar文件,创建了库,xml编译文件,并尝试使用它。不幸的是,我在console(Eclipse)中得到了这样的语句: 这是我的测试类代码: 和我的xml配置文件: 我还尝试使用不带标记的xml,以及包规范和各种文件夹/包目录,但没有帮助。现在我的文件直接位于Eclipse的project文件夹中。

  • 我想使用新的log4j2-Java日志框架。一切正常,但我从一小时后就尝试加载一个自定义配置文件来配置日志记录(如日志级别)。 这是我的log4j2.xml: 我尝试了以下方法,但没有任何效果: 移动log4j2.xml文件,使其位于默认包中。 将log4j2.xml文件移动到项目中的任意位置 将log4j2.xml文件命名为log4j.xml 在项目中创建一个文件夹,将log4j2.xml文件放

  • 问题内容: 在我的application.yml中,我得到了: 还有其他一些使用不同的配置文件。启动应用程序时,我得到以下信息: 如果我只是将log4j2.xml放在已分析的文件旁边,则它可以工作。所以我认为这是我错过依赖关系的原因,或者使用log4j2无法实现? 问题答案: 在我这边,我正在使用属性文件而不是Yaml文件。我需要两个日志文件:一个将所有内容记录到控制台,另一个用于记录文件。因此,

  • 我已经将其隔离到一个非常简单的测试项目中,该项目除了简单的log4j2test配置使用之外没有其他用途。文件目录结构: 建筑sbt: log4j2.xml内容复制/粘贴从示例在官方留档:https://logging.apache.org/log4j/2.x/manual/configuration.html SimpleMain。斯卡拉: 我跑步与 输出:

  • 我是Log4J2的新手。我正在尝试配置一个使用slf4j和LOG4J2的日志记录系统。

  • 问题内容: 我已将应用程序迁移到log4j 2,并通过log4j2.xml对其进行了配置 但是,我正在使用的某些库取决于log4j1。如果我使用以下命令运行该应用程序: log4j 1抱怨找不到配置文件。我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥。是否可以使用单个log4j2.xml进行配置? 我尝试过的替代方法是同时配置log4j和lo