gpt4 book ai didi

java - 如何以编程方式正确配置 log4j2?

转载 作者:行者123 更新时间:2023-12-02 06:19:59 25 4
gpt4 key购买 nike

我正在尝试设置 log4j2 使用 RollingFileAppender 写入日志。我想以编程方式配置日志系统,而不是使用 XML 文件。

这是我尝试过的(大部分与 https://logging.apache.org/log4j/2.x/manual/customconfig.html#Configurator 中的文档相同):

public static void configure(String rootLevel, String packageLevel) {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory
.newConfigurationBuilder();

builder.setConfigurationName("RollingBuilder");
builder.setStatusLevel(Level.TRACE);

// Create a rolling file appender

LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1}:%L - %m%n");

ComponentBuilder triggeringPolicy =
builder
.newComponent("Policies")
.addComponent(
builder
.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "200M")
);

AppenderComponentBuilder appenderBuilder =
builder
.newAppender("rolling", "RollingFile")
.addAttribute("fileName", "log")
.addAttribute("filePattern", "log.%d.gz")
.add(layoutBuilder)
.addComponent(triggeringPolicy);

builder.add(appenderBuilder);

// Create new logger

LoggerComponentBuilder myPackageLoggerBuilder =
builder.newLogger("com.mypackage", packageLevel)
.add(builder.newAppenderRef("rolling"))
.addAttribute("additivity", false);
builder.add(myPackageLoggerBuilder);

RootLoggerComponentBuilder rootLoggerBuilder =
builder
.newRootLogger(rootLevel)
.add(builder.newAppenderRef("rolling"));
builder.add(rootLoggerBuilder);

// Initialize logging
Configurator.initialize(builder.build());
}

我在 main 方法的开头调用 configure() 方法。当我运行程序时,会创建一个名为 log 的文件,但所有日志输出都转为标准输出,并且 log 文件仍为空。

有人可以帮忙找出我的配置有什么问题吗?

我没有使用任何 log4j 配置文件,如果这有什么区别的话。还在我的代码中使用 slf4j API。依赖关系 -

org.apache.logging.log4j:log4j-api:2.11.1
org.apache.logging.log4j:log4j-core:2.11.1
org.apache.logging.log4j:log4j-slf4j-impl:2.11.1
org.slf4j:slf4j-api:1.7.25

最佳答案

首先,此答案是对您评论中提供的附加信息的回应。

My requirement is that I want to control log levels for different packages via command line flags when I launch my program

由于您想使用程序参数来控制日志级别,我建议您查看 Main Arguments LookupRouting Appender 。结合使用这两个功能,您可以设置日志记录配置,以根据程序参数将日志事件发送到适当的附加程序。

我将提供一个简单的示例来帮助指导您。

首先是一个生成一些日志事件的 Java 类示例:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.lookup.MainMapLookup;

public class SomeClass {

private static Logger log = LogManager.getLogger();

public static void main(String[] args){
MainMapLookup.setMainArguments(args);

if(log.isDebugEnabled())
log.debug("This is some debug!");
log.info("Here's some info!");
log.error("Some error happened!");
}
}

接下来是log4j2的配置文件(详细信息请参阅代码中的注释):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Routing name="myRoutingAppender">
<!-- log events are routed to appenders based on the logLevel program argument -->
<Routes pattern="$${main:logLevel}">
<!-- If the logLevel argument is followed by DEBUG this route is used -->
<Route ref="DebugFile" key="DEBUG" />
<!-- If the logLevel argument is omitted or followed by any other value this route is used -->
<Route ref="InfoFile" />
</Routes>
</Routing>

<!-- This appender is not necessary, was used to test the config -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>

<!-- Below are the 2 appenders used by the Routing Appender from earlier -->
<File name="DebugFile" fileName="logs/Debug.log" immediateFlush="true"
append="false">
<PatternLayout
pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>

<File name="InfoFile" fileName="logs/Info.log" immediateFlush="true"
append="false">
<PatternLayout
pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<LevelRangeFilter minLevel="FATAL" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
</Appenders>

<Loggers>
<!-- Root logger is set to DEBUG intentionally so that debug events are generated.
However, events may be ignored by the LevelRangeFilter depending on where they
are routed by the Routing Appender
-->
<Root level="DEBUG">
<AppenderRef ref="Console" />
<AppenderRef ref="myRoutingAppender" />
</Root>
</Loggers>
</Configuration>

如果您不提供“logLevel”参数,则使用此配置,然后默认情况下日志事件将路由到“InfoFile”附加程序,并且任何比 INFO 更具体的事件都将通过 LevelRangeFilter 被忽略.

如果提供了“logLevel”参数并且后跟“DEBUG”,则日志事件将路由到“DebugFile”附加程序,并且不会忽略任何事件。

请注意,我确实尝试使用查找来设置日志级别,但似乎无法通过查找来配置日志级别参数。这就是为什么我必须使用这种替代方法。我对这种方法的一个担忧是,正如我在配置文件中的注释中指出的那样,日志级别必须保持在 DEBUG,这意味着即使您不使用它们,您也始终会生成 DEBUG 事件。这可能会影响性能。解决方法是使用程序参数来确定是否需要生成调试事件。例如:

通常你会使用:

if(log.isDebugEnabled())
log.debug("This is some debug!");

但是当使用上面的配置时,你会使用类似的东西:

if("DEBUG".equals(args[1]))
log.debug("This is some debug!");

如果需要,您可以使用枚举(甚至可以使用 log4j2 提供的 Level 类)来提高效率。

我希望这可以帮助您入门。

关于java - 如何以编程方式正确配置 log4j2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53567092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com