log4j2 相关问题

Log4j 2是Log4j的升级版,Log4j是一个基于Java的日志记录实用程序,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。

Log4j2 控制台附加程序出现 NullpointerException

我的应用程序日志记录在测试中的 Maven 构建期间崩溃。这是我在 src/test/resources 中的 log4j2.xml: 我的应用程序日志记录在测试中的 Maven 构建期间崩溃。这是我在 src/test/resources 中的 log4j2.xml: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <Console name="stdout" target="SYSTEM_OUT"> <PatternLayout pattern="MyApp: %d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %c{1.} - %m%n" /> </Console> </Appenders> <Loggers> <Logger name="com.my.app" level="info" additivity="false"> <Appender-ref ref="stdout"/> </Logger> <Root level="error"> <Appender-ref ref="stdout"/> </Root> </Loggers> </Configuration> 我在构建过程中的测试过程中遇到了这个异常: 2017-11-23 15:12:28,371 main ERROR An exception occurred processing Appender stdout java.lang.NullPointerException at org.apache.logging.log4j.core.impl.ThrowableProxy.toExtendedStackTrace(ThrowableProxy.java:671) at org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:138) at org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:122) at org.apache.logging.log4j.core.impl.Log4jLogEvent.getThrownProxy(Log4jLogEvent.java:566) at org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.format(ExtendedThrowablePatternConverter.java:64) at org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:38) at org.apache.logging.log4j.core.layout.PatternLayout$PatternSerializer.toSerializable(PatternLayout.java:333) at org.apache.logging.log4j.core.layout.PatternLayout.toText(PatternLayout.java:232) at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:217) at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:57) at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:177) at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170) at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161) at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156) at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129) at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120) at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84) at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448) at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:433) at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417) at org.apache.logging.log4j.core.config.LoggerConfig.logParent(LoggerConfig.java:439) at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:434) at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417) at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:403) at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63) at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146) at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2116) at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2100) at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1994) at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1966) at org.apache.logging.slf4j.Log4jLogger.error(Log4jLogger.java:319) at com.my.app.MyTest.testingMyApp(MyTest.java:89) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283) at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) 这是我的pom: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jul</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.dblock.log4jna</groupId> <artifactId>log4jna-api</artifactId> </dependency> log4j的版本是2.9.1 有趣的是,它会记录到控制台,例如当 Spring 应用程序启动时,我可以看到来自具有 @SpringBootApplication 注释的 MyApplication.java 的日志。 MyTest.java:89 是: logger.error("error occured",e); 记录器来自: import org.slf4j.Logger; import org.slf4j.LoggerFactory; 所以看起来它在错误日志期间崩溃了,但是如果我记录正常信息就没有问题。 那么这个空指针是什么? 好吧,我明白了:这是因为在测试类中我有一个模拟异常。如果我将其更改为从异常中创建一个新对象,它就可以正常工作。 我想它是报告错误的一个很好的候选者。 您作为 Exception 的参数传递的 Throwable 或 logger.error("error occured", e); 没有任何堆栈跟踪(其堆栈跟踪是 null),但是您正在使用的 Log4j2 实现尝试访问所述堆栈跟踪并抛出此错误。 查看源代码,抛出错误的行是: stackLength = stackTrace.length; 意味着 stackTrace 变量是 null。它是通过 throwable.getStackTrace() 从您作为参数传递给 的 Throwable (Exception) 获得的 logger.error("error occured", e); 至于为什么你的堆栈跟踪为空,这取决于你正在使用的JVM以及你如何得到所述异常。它可能会发生,但这绝对不是标准行为。你可以看看这个帖子和这个帖子。 如果您需要使用Mockito创建模拟异常,则可以设置getStackTrace方法以返回StackTraceElement的空数组: private Throwable logSafeExceptionMock(Class<? extends Throwable> exceptionType) { Throwable t = mock(exceptionType); when(t.getStackTrace()).thenReturn(new StackTraceElement[0]); return t; } 谢谢 Dmitry Timofeev,你拯救了我的一天!

回答 4 投票 0

重新编码/解析由log4j2创建的日志,返回LogEvents

我使用 log4j2 FileAppender 创建了日志文件。在不重新创建我自己的解析器的情况下,我试图找到一种方法来使用 log4j2 已有的内容来重新编码 lo...

回答 1 投票 0

Log4j2 smtp 附加程序在不指定 smtpPassword 字段的情况下是否可以工作?

在log4j2官方文档中有一个smtp附加器的代码片段。我的问题是没有包含smtpPassword字段。它会起作用吗?如果是的话那么我们到底在哪里

回答 1 投票 0

Log4j2 未记录到文件

我在我的应用程序中使用 Log4j2,它似乎加载和初始化得很好。 控制台被登录,2 个指定的文件附加程序创建各自的文件,但这些文件保持为空! 是我的

回答 3 投票 0

Log4j2 在 apender 中过滤特定级别

我应该使用什么过滤器来定义要使用附加程序记录的特定级别?例如: 爪哇: LOGGER.debug("调试消息"); LOGGER.info("信息消息"); 记录器.警告(“...

回答 7 投票 0

Log4j2 createOnDemand="true" 不允许每天创建新文件

Log4j2 createOnDemand="true" 不允许每天创建新文件,尽管使用带有 TimeBasedTriggeringPolicy 的 RollingFile Appender。 下面是我的 log4j2.xml 文件。 我哈...

回答 2 投票 0

Log4j2 未读取配置文件

请友善,我是日志记录的新手,即使在尝试了很多事情并完全按照文档进行操作之后,我还是遇到了 log4j2 的一些问题。 我花了整个早上的时间来尝试

回答 1 投票 0

Glassfish/Payara SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”

这些是我的 pom 文件中的日志依赖项: org.apache.logging.log4j log4j-api 这些是我的 pom 文件中的日志依赖项: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.20.0</version> </dependency> 这是我的 log4j2.xml 文件: <?xml version="1.0" encoding="UTF-8"?> <!-- Development --> <Configuration status="trace" strict="true" monitorInterval="30"> <Properties> <Property name="logs">../logs/rpay/batch</Property> </Properties> <Appenders> <Appender type="Console" name="console" target="SYSTEM_OUT"> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [executionId:%X{executionId}] %level: %msg%n"/> </Appender> <Appender type="RollingFile" name="standard" filename="${logs}/standard.log" filePattern="${logs}/standard.%d{yyyy-MM-dd}.log.gz"> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [executionId:%X{executionId}] %level: %msg%n"/> <Policy type="TimeBasedTriggeringPolicy" /> </Appender> <Appender type="RollingFile" name="error" filename="${logs}/error.log" filePattern="${logs}/error.%d{yyyy-MM-dd}.log.gz"> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [executionId:%X{executionId}] %level: %msg%n%exception%n"/> <Policy type="TimeBasedTriggeringPolicy" /> </Appender> <Appender type="RollingFile" name="outside" filename="${logs}/outside.log" filePattern="${logs}/outside.%d{yyyy-MM-dd}.log.gz"> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS},%t,%X{executionId},%msg%n"/> <Policy type="TimeBasedTriggeringPolicy" /> </Appender> </Appenders> <Loggers> <Logger name="error" level="debug" additivity="false"> <AppenderRef ref="console" /> <AppenderRef ref="standard" /> <AppenderRef ref="error"/> </Logger> <Logger name="outside" level="info" additivity="false"> <AppenderRef ref="outside" /> </Logger> <Root level="debug"> <AppenderRef ref="console" /> <AppenderRef ref="standard" /> </Root> </Loggers> </Configuration> 我尝试了此处列出的所有解决方案。 如何修复“SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。” 但是错误并没有得到解决。 您的设置应适用于 GlassFish 7.0.10 或更高版本。 在较旧的 GlassFish 版本或 Payara 服务器中,它不起作用,因为类加载器加载类的方式不同。在那里,slf4j 类存在于 GlassFish/Payara 安装中。它们由父类加载器加载,并且在您的应用程序中看不到 log4j 绑定类。这已在 https://stackoverflow.com/a/77074140/784594 中进行了讨论,并确认它在 GlassFish 7.0.10 中有效。 解决方法是将 log4j 和 slf4j JAR 文件以及 log4j.xml 文件从应用程序复制到 GlassFish 域的 lib 目录中,以便由在 GlassFish 安装中加载库的同一类加载器加载它们。

回答 1 投票 0

如何使用log4j2在库中登录到特定文件路径?

我有一个 Java 库 (SDK),它将作为 JAR 在其他应用程序中使用。我现在正在使用 log4j2 和 SLF4J 进行日志记录,但是当我的库被其他应用程序消耗时(也使用 l...

回答 1 投票 0

无法解析包,因为filter:="(&(osgi.wiring.package=org.slf4j)(version>=2.0.0)(!(version>=3.0.0)))"

我正在尝试使用使用 Log4j2 v2.22.1 的应用程序运行 Karaf 4.4.3。但是,我得到了例外: 导致:org.apache.felix.resolver.reason.ReasonException:无法解析 com.my.bundle/4...

回答 1 投票 0

使用 log4j2 编写自定义 json 消息的最佳方式

我一直在不同类型的项目中使用log4j,并且对log4j2有一些经验。所有实现都使用默认的附加程序和布局。目前我需要编写一个应用程序......

回答 5 投票 0

更改 Azure 函数日志上的 Json 结构存档到存储帐户

我在使用 Spring Framework + Log4j2 + JsonTemplate 时遇到 Azure Function log(在存储帐户上)的巨大问题。 如您所见,我已激活存储帐户上的日志存档(blob 存储...

回答 1 投票 0

如何在 log4j2 Java 属性文件中正确配置自定义 PatternSelector

我正在使用属性文件来配置 Log4j2,但无法弄清楚如何配置我的自定义 PatternSelector 插件。我的附加程序定义为: 附加器.滚动.布局.类型 =

回答 1 投票 0

此 XML 配置的正确 Java 属性文件翻译是什么?

上下文 我一直在使用 Java 属性文件搜索特定于配置 log4j2 的文档,但我能找到的只是一些相当基本的示例。我找到的大多数文档,如果有的话

回答 1 投票 0

log4j2 - Syslog 附加程序和 PatternLayout

我需要将事件记录到系统日志中。 我使用 lo4j2 和 syslog 附加程序。 log4j2.xml 中的附加程序块如下所示: 我需要将事件记录到系统日志中。 我使用 lo4j2 和 syslog 附加程序。 我的 log4j2.xml 中的附加程序块看起来像这样: <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1"> </Syslog> <RollingFile name="AppLog" fileName="/var/log/app.log" filePattern="/var/log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> </Policies> </RollingFile> </appenders> 如您所见,我有一个具有特定 PatternLayout 的 Console Appender 和 RollingFile Appender。 我想对 Syslog 附加程序使用相同的 PatternLayout。 但是,系统日志中的日志消息似乎始终使用预定义的布局。 我尝试执行以下操作: <Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Syslog> 但这没有任何效果。系统日志消息仍然具有相同的预定义格式。 如何确定进入系统日志的日志消息的格式? 正如本 log4j2 bug 报告中提到的,log4j2 的开发人员将 SyslogAppender 编码为 SocketAppender 硬连线到 SyslogLayout 因为它旨在符合原始系统日志格式或 RFC 5424。不应允许任何其他布局。 不幸的是,他们没有意识到 RFC 5424 规范并未对日志中包含的消息强制执行任何特定格式,在 Log4j2 实现中仅是日志的 %m 部分。 为了解决这个问题,一个解决方案(在同一个错误报告中建议)是在 SocketAppender 内使用 PatternLayout 重现 syslog 格式,就像这样 <Socket name="SYSLOG" host="localhost" port="514" protocol="UDP"> <PatternLayout pattern="&lt;1&gt;%d{MMM dd HH:mm:ss} ${hostName} appName: { &quot;host&quot;:&quot;${hostName}&quot;, &quot;thread&quot;:&quot;%t&quot;, &quot;level&quot;:&quot;%p&quot;, &quot;logger&quot;:&quot;%c{1}&quot;, &quot;line&quot;:%L, &quot;message&quot;:&quot;%enc{%m}&quot;, &quot;exception&quot;:&quot;%exception&quot; }%n" /> </Socket> 这将通过 UDP 将格式良好的 RFC5424 日志写入本地 514 端口。以下是示例日志输出: Sep 14 10:40:50 app-hostname app-name: { "host":"host-name-01", "thread":"http-nio-8080-exec-4", "level":"DEBUG", "logger":"ExecuteTimeInterceptor", "line":52, "message":"GET &#x2F;health 200 served in 3", "exception":"" } 我不相信您可以在基本 Syslog 附加程序上使用模式。 从文档中可以看出 “SyslogAppender 是一个 SocketAppender,它将其输出写入由主机和端口指定的远程目标,格式符合 BSD Syslog 格式或 RFC 5424” http://logging.apache.org/log4j/2.x/manual/appenders.html#SyslogAppender 但是,它确实允许您指定“format = RFC 5424” 如果您使用 RFC 5424 然后你可以在loggerFields参数中放置一个PatterLayout。 请参阅http://logging.apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout 希望有帮助! 您可以使用 LoggerFields 标签向 RFC5424 格式的 SyslogAppender 消息添加其他元素,如下所示: <LoggerFields> <KeyValuePair key="thread" value="%t"/> <KeyValuePair key="priority" value="%p"/> <KeyValuePair key="category" value="%c"/> <KeyValuePair key="exception" value="%ex"/> </LoggerFields> 然后我使用 rsyslog 的 RFC5424 解析模块 mmpstrucdata 将它们拉出,以创建 json 树。用于访问它们的 rsyslog.conf 模板如下所示: template(name="jsondump" type="string" string="'%$!rfc5424-sd!mdc@18060!thread%', '%$!rfc5424-sd!mdc@18060!priority%', '%$!rfc5424-sd!mdc@18060!category%', '%$!rfc5424-sd!mdc@18060!exception%'") 我只是想做同样的事情,并认为我会分享对我有用的东西。 - 萨姆 您可以使用 SocketAppender 和 PatternLayout 来格式化 syslog (syslog-ng) 消息。 为了使用固定设施支持动态严重性(例如:“用户级消息” - 请参阅RFC5424),模式应如下所示: <Socket name="SYSLOG" host="${env:INTERFACE}" port="514" protocol="UDP"> <PatternLayout pattern="&lt;%level{TRACE=15, DEBUG=15, INFO=14, WARN=12, ERROR=11, Fatal=11}&gt;%replace{${env:APPLICATION_NAME}}{\r}{}[%X{PID}] %t(%T) %c{10} - %m%n"/> </Socket> 要计算设施“用户级消息”和严重性“信息消息”的优先级值 (PRIVAL) - 请参阅 RFC5424 - 以下示例可能有所帮助: Syslog: Facility | Severity Numerical Code: 1 6 Bin: 0 0 0 0 1 | 1 1 0 Dec: 8 + 6 = 14 log4j2syslog-ngsocketappenderpatternlayout 我使用butcher82发布的配置,但必须对其进行一些更改才能产生我需要的结果。 我最终得到的是一条具有正确优先级、时间戳(几天前没有前导零)、主机和消息部分的消息。 syslog 和 log4J 级别之间的映射按照 org.apache.log4j.Level 中的定义使用,并且设施设置为 1(用户级消息),以简化优先级计算。 此模式应与 RFC-3164 兼容: <Socket name="SysLogAppender" host="localhost" port="514" protocol="UDP"> <PatternLayout pattern="&lt;%level{TRACE=7, DEBUG=7, INFO=6, WARN=4, ERROR=3, Fatal=0}&gt;%d{MMM d hh:mm:ss} ${hostName} %m%n"/> </Socket> 以下是生成的输出: <3>Dec 15 09:59:16 foo.bar.hostname this is a test message 注意: 可以在主机名后添加应用程序名称或 pid。

回答 5 投票 0

如果我执行“作为 Java 应用程序运行”,则会出现错误 -“ERROR StatusLogger Log4j2”

如果我使用“作为 Java 应用程序运行”运行我的测试/java 类,则会出现以下错误 - “错误 StatusLogger Log4j2 找不到日志记录实现。请将 log4j-core 添加到

回答 1 投票 0

如何在Java Web应用程序中生成带有数值的JSON日志?

我需要为 Spring Boot 应用程序添加 JSON 日志,该应用程序配置为使用 SLF4J 和 Log4j2 进行日志记录。除了常规日志事件属性(如消息、日志记录级别、时间戳等)

回答 1 投票 0

如何使用 log4j2 以编程方式为一个包的一组记录器设置 logLevel?

如何以编程方式为一个包的一组记录器设置日志级别? 这个变体不起作用 Configurator.setLevel("com.something.packwirhloggers", Level.ERROR) 我怎样才能实现...

回答 1 投票 0

Log4j2 在其他位置找不到 log42j.xml 而不是类路径(资源文件夹)Tomcat

我正在为 TomCat 9.0 服务器开发 java web 应用程序 (v3.0),但在加载 log4j2.xml 文件时遇到问题。 我已经在项目外部定义了 log4j2.xml 文件,并定义了该文件的路径...

回答 1 投票 0

如何使用 Log4j2 在 shutdown hooks 中登录?

Log4j2 还使用关闭挂钩来结束其服务。但当然我想记录我的应用程序的整个生命周期 - 包括关闭。对于 Log4j 这没有问题。现在看来...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.