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

xml不是在运行时选择系统属性中的更改吗?

高修伟
2023-03-14

使用log4j2记录器和服务器创建一个spring-boot应用程序是wildfly10/jboss7.1。我从Configuration:System Properties添加了“System Properties”:“LogLevel”,并且能够从Spring Boot应用程序访问它。我在log4j2.xml中调用了这个系统属性来设置日志级别。log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error" monitorInterval="30">
    <Properties>
        <Property name="basePath">D://propertieslog</Property>
    </Properties>

    <Appenders>

        <RollingFile name="fileLogger" fileName="${basePath}/acweb.log" filePattern="${basePath}/acweb-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
        <Jdbc name="databaseAppender" tableName="APPLICATION_LOG">
            <Filters>
                First deny warn, error and fatal messages
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL" />
                Then accept info, warn, error, fatal and deny debug/trace
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <ConnectionFactory class="path" method="getDatabaseConnection" />
            <Column name="LOGLEVEL" pattern="%level" />
            <Column name="LOGGER" pattern="%logger" />
            <Column name="MESSAGE" pattern="%message" />
        </Jdbc>
    </Appenders>
    <loggers>
        <Root level="${sys:loglevel:-ERROR}">
            <appender-ref ref="console" />
            <appender-ref ref="fileLogger" />
            <appender-ref ref="databaseAppender" />
        </Root>
    </loggers>

</configuration>

控制器类:

@GetMapping("/dashboard")
    public ModelAndView welcomeMethod(HttpServletRequest request, HttpServletResponse response,
            @ModelAttribute("token") final AccessToken accessToken) {
        if(null==accessToken.getJwtToken()) { 
            logger.trace("A TRACE Message");
            logger.debug("A DEBUG Message");
            logger.info("An INFO Message");
            logger.warn("An WARN Message");
            logger.warn("Printing system property1:"+ System.getProperty("loglevel"));
            logger.error("An ERROR Message");
            logger.error("Printing system property1:"+ System.getProperty("loglevel"));
            return new ModelAndView("redirect:launchApp"); 
        } 
[WARN ] 2018-09-26 15:13:05.787 [default task-7] WelcomeController - An WARN Message
[WARN ] 2018-09-26 15:13:05.792 [default task-7] WelcomeController - Printing system property1:WARN
[ERROR] 2018-09-26 15:13:05.793 [default task-7] WelcomeController - An ERROR Message
[ERROR] 2018-09-26 15:13:05.793 [default task-7] WelcomeController - Printing system property1:WARN
[WARN ] 2018-09-26 15:15:34.933 [default task-11] WelcomeController - An WARN Message
[WARN ] 2018-09-26 15:15:34.933 [default task-11] WelcomeController - Printing system property1:INFO
[ERROR] 2018-09-26 15:15:34.935 [default task-11] WelcomeController - An ERROR Message
[ERROR] 2018-09-26 15:15:34.935 [default task-11] WelcomeController - Printing system property1:INFO

共有1个答案

夏侯博
2023-03-14

我认为您无法通过代码重写log4j2.xml。

除了@jamesr.perkins所说的,log4j2的配置说明:

“注意,与Log4J1.x不同,公共Log4J2 API不公开添加、修改或删除附加器和筛选器的方法,也不以任何方式操作配置。”

Log4j2提供了一个通过Java配置日志记录的指南,它对...会有点让人困惑。这是他们的向导。

如果您知道log4j2.xml是如何设置的,那么在阅读本指南并使用我的示例时,这将有助于使其更容易一些。

一个小小的附注...

在我看来,你是在否认一切,然后接受痕迹。最简单的方法是:

<Jdbc name="databaseAppender" tableName="APPLICATION_LOG">
    <ThresholdFilter level="DEBUG" onMatch="DENY" onMismatch="NEUTRAL" />
    <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
    <!-- Other properties / attributes... -->
</Jdbc>

这就是它的翻译:

--------------------------------
| Level   | Int value | Action |
--------------------------------
| FATAL   | 100       | DENY   |
--------------------------------
| ERROR   | 200       | DENY   |
--------------------------------
| WARN    | 300       | DENY   |
--------------------------------
| INFO    | 400       | DENY   |
--------------------------------
| DEBUG   | 500       | DENY   |
--------------------------------
| TRACE   | 600       | ACCEPT |
--------------------------------

如果您在记录器中引用了一个附加器并设置了一个级别,那么您正在设置最小级别。

<appenders>
    <FileAppender name="Foo" fileName="theLogPath/fooLog.log" />
</appenders>
<Loggers>
    <Logger name="package.FooClass">
        <AppenderRef ref="Foo" level="INFO" />
    </Logger>
</Loggers>
<FileAppender name="Foo" fileName="theLogPath/fooLog.log">
    <ThresholdFilter level="ERROR" onMatch="DENY" onMisMatch="ACCEPT" />
</FileAppender>

如果这没有帮助,让我知道我错过了什么:)

 类似资料:
  • 问题内容: 如何从Java程序外部更改user.home系统属性,使其认为它与D:\ Documents and Settings \%USERNAME%是不同的目录?通过环境变量还是VM参数? 问题答案: 设置VM参数应该起作用: 这是一个测试案例: 在Win XP和Linux上使用Java 1.5.0_17测试

  • 问题内容: 我有一个运行的现有jar文件。它是Selenium RC服务器。我希望能够更改JVM httpProxy.host/port/etc系统值。一方面,我可以修改源代码并添加此功能。这将需要一些时间。还有另一种可能的方法吗?就像我自己的JAR(将设置这些JVM属性)在同一个JVM实例中调用selenium- rc(这样,它便能够修改其JVM变量的值)? 问题答案: 您可以使用以下命令在命令

  • 问题内容: 我需要在运行时在应用程序中更改属性。例如,我有一项服务,该服务发送带有重置密码的电子邮件。要求有效期为12小时。但是我想在运行时将此时间更改为24或更多。我需要给管理员执行此操作的机会。 我的财产文件有 我的服务 我的Spring xml配置 我可以在运行时以某种方式更改此值吗? 问题答案: 只需远离xml配置,就快要到2017年了。 使用@Value,您将从属性文件中获取hours.

  • 我正在编写一个桌面Spring Boot和数据JPA应用程序 初始设置来自应用程序。属性(一些spring.datasource.和spring.jpa.) 我的程序的一个功能是可以通过ui指定数据库设置(rdbms类型、主机、端口、用户名、密码等)<这就是为什么我想在运行时重新定义已经初始化的db属性。这就是为什么我正在寻找一种方法来做到这一点。 我试着做以下事情: 1)我编写了自定义DbCon

  • 我正在尝试选择一些不在我的中的属性。这可能吗? 如何从中获取CatId和持久属性? 如果我将它们添加到组中,就像,那么我的结果就会混乱。 我可以使用获得其他属性,如,但这些属性不是计算值。 数据示例: 希望将结果按如下方式分组:

  • 问题内容: 我的页面中有图像,并且在CSS选择器之前使用:bestyle。 图片是动态的,因此没有固定的宽度;所以我需要动态设置:before规则的宽度。 我想在客户端使用JQuery做到这一点。 假设: 如何使用JQuery 仅更改带有选择器的类的width属性(如果没有选择器,则不能更改一个类的width属性)? 问题答案: 我认为没有直接访问伪类规则的jQuery方法,但是您总是可以在文档的