log4j2 相关问题

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

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

Log4j2 JsonTemplateLayout - 将消息字段记录为 json

我有这个log4j2.xml: 我有这个log4j2.xml: <?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <Console name="JsonAppender" target="SYSTEM_OUT"> <JsonTemplateLayout eventTemplateUri="classpath:EcsLayout.json" /> </Console> </Appenders> <Loggers> <Logger name="JsonLogger" level="INFO" additivity="false"> <AppenderRef ref="JsonAppender"/> </Logger> <Root level="info"> <AppenderRef ref="JsonAppender"/> </Root> </Loggers> </Configuration> 在我的代码中,我有一个日志语句,例如: HashMap logMap = new HashMap<>(); logMap.put("appId", "123456789"); logMap.put("action", "Received request"); logger.info(new ObjectMessage(logMap)); 在我的日志中我得到了这个: { "@timestamp": "2022-02-02T10:52:56.100Z", "ecs.version": "1.2.0", "log.level": "INFO", "message": "{appId=123456789, action=Received request}", "process.thread.name": "main", "log.logger": "org.xxxx.App" } 没关系,但我希望 message 采用 json 格式,所以希望: "message": { "appId": "123456789", "action": "Received request" } 我知道使用 JsonLayout 你必须指定 objectMessageAsJsonObject="true",但怀疑使用 JsonTemplateLayout 时有点微妙。 TIA。 进一步阅读 JSON 模板布局文档后,您可以利用 eventTemplateAdditionalField 参数修改事件模板字段。 似乎有几种方法可以解决此问题,但我选择的选项是修改 log4j2.xml: <Appenders> <Console name="JsonAppender" target="SYSTEM_OUT"> <JsonTemplateLayout eventTemplateUri="classpath:LambdaEcsLayout.json"> <EventTemplateAdditionalField key="message" format="JSON" value='{"$resolver": "message", "field": "name"}'/>/> </JsonTemplateLayout> </Console> </Appenders> 登录时,有这样的内容: var logMap = new HashMap<>(); logMap.put("id", "123456789"); logMap.put("action", "Received request"); var om = new ObjectMessage(logMap); log.info(om); 可能有一种更简洁的方法来处理后者,某种包装器等 - 但你明白了。 我能够让@Hurricane的方法起作用,但在尝试简化它时,我发现你可以省略 元素并添加 "message": { "$resolver": "message", "stringified": false } 改为模板布局。您还可以省略“stringified”属性,因为它默认为“false”。 OP 不包括布局,但我怀疑他已将“stringified”设置为“true” 我和Alan有同样的问题,有解决办法吗? 嗯,经过审查,这对我不起作用。它对我来说不适用于某些任意对象,例如我得到 "message":{"x":{"a":"b"},"p":"com.xyz.Person@3132fc"} x 是一张地图,很好。 p 是一个 bean,是错误的,但可以使用 jsonLayout 来工作文件。为什么这一切如此困难?这太荒谬了。 – 艾伦·海伊 2023 年 10 月 26 日 16:27

回答 3 投票 0

Log4j 1.x 到 2.x 的 JDBCAppender 迁移

我正在尝试将应用程序从 log4j v1.2 迁移到 v2.17。在该应用程序中,他们通过导入在 Java 中使用 JDBCAppender,并将其扩展为一个类并执行一些操作。 嗬...

回答 1 投票 0

如何使用Spring Cloud Config Server集中log4j2配置

我正在使用 Spring Cloud 配置服务器文件系统后端:docs.spring.io 我有一个多 Maven 项目 项目: ├── pom.xml │ ├── 项目配置提供者 │ ├── pom.xml │ ├── 源代码 │ │ └── 麦...

回答 1 投票 0

如何将其他属性引用到log4j2 yaml配置中?

我使用以下 log4j2 yaml 配置: 配置: 附加器: 安慰: 名称:控制台 目标:SYSTEM_OUT JSON布局: 紧凑:真实 eventEol:真的...

回答 1 投票 0

log4j 与 jdk21 兼容吗?

当我尝试使用 ant 单 jar 文件(使用 jar-in-jar-loader)构建时,里面的所有内容看起来都符合预期。清单内容是 清单版本:1.0 Ant 版本:Apache Ant 1.10.14 创建-...

回答 1 投票 0

错误日志记录问题:使用带有 log4j2 的 cxf-jaxrs 的 java Restful 应用程序在迁移 cxf 后未将错误和异常堆栈跟踪打印到文件

在我们的 Spring Java 应用程序中尝试升级 cxf 和 log4j2 版本后; cxf 从 2 -> 3.1 & log4j 1.x -> 2.x;日志记录已损坏。滚动文件附加器和 smtp 附加器可以...

回答 1 投票 0

log4j2 使用 Maven 将所有日志写入 Spring Boot 3.1.0 中的特定文件时出现问题

我正在尝试设置 log4j2 将所有日志写入特定文件。我尝试了在互联网上找到的各种方法,但日志仍然只显示在控制台中。 我正在使用 IntelliJ IDEA CE。 春天...

回答 2 投票 0

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