我正在尝试将 Spark 结构化流应用程序的应用程序级日志存储在 AWS Cloudwatch 日志中
我正在尝试使用以下 github 存储库中的 Log4J2 cloudwatch 附加程序(链接为 https://github.com/kdgregory/log4j-aws-appenders/tree/trunk)
当我从 intellij idea 运行时,程序正在运行并成功将流日志加载到 Cloudwatch 中。但是,当我尝试将其转换为 jar 文件并尝试从 ec2 实例运行时,它会抛出以下错误:
2024-12-03T07:06:05.291599Z main ERROR 处理元素 CloudWatchAppender 时出错([Appenders: null]):CLASS_NOT_FOUND
Log4j2 属性文件:
status = debug
name= LoggingConfig
# ConsoleAppender will print logs on console
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.target = SYSTEM_OUT
appender.console.layout.type = PatternLayout
# Specify the pattern of the logs
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] - %msg%n
#Specify the pattern of the cloudwatch logs
appender.cloudwatch= com.kdgregory.log4j2.aws.CloudWatchAppender
appender.cloudwatch.type= CloudWatchAppender
appender.cloudwatch.name = CLOUDWATCH
appender.cloudwatch.layout.type = PatternLayout
appender.cloudwatch.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] - %msg%n
appender.cloudwatch.logGroup= sparklog
appender.cloudwatch.logStream= cloudwatch-{date}-{hostname}-${awslogs:pid}
# Mention package name here in place of example. Classes in this package or subpackages will use ConsoleAppender and CLOUDWATCH for logging
logger.app.name = sparkapp
logger.app.level = info
logger.app.additivity = false
logger.app.appenderRef.console.ref = consoleLogger
logger.app.appenderRef.cloudwatch.ref = CLOUDWATCH
#Configure root logger for logging error logs in classes which are in package other than above specified package
rootLogger.level = info
rootLogger.additivity = false
rootLogger.appenderRef.console.ref = consoleLogger
rootLogger.appenderRef.console.level = error
rootLogger.appenderRef.cloudwatch.ref = CLOUDWATCH
以下是我使用过的依赖项:
依赖项{
//Logging
implementation 'org.apache.logging.log4j:log4j-core:2.23.1'
implementation 'org.apache.logging.log4j:log4j-api:2.23.1'
// Dependencies for aws cloudwatch log
implementation 'com.amazonaws:aws-java-sdk-logs:1.12.765'
implementation 'software.amazon.awssdk:cloudwatchlogs:2.26.30'
// Dependencies for log4j2 appender for aws cloud watch
implementation 'com.kdgregory.logging:log4j2-aws-appenders:3.2.1'
implementation 'com.kdgregory.logging:aws-facade-v2:3.2.1'
implementation 'com.kdgregory.logging:logwriters:3.2.1'
}
请注意从 ide 运行应用程序时没有问题。仅在以 jar 文件形式提交应用程序时出现问题。
以下是使用应用程序 fat jar 或 Thin jar 以及所有 jar 依赖项运行应用程序时出现的错误:
2024-12-03 07:23:07,843 主要错误无法找到插件类型 CloudWatchAppender 2024-12-03 07:23:07,890 主要警告级别被忽略 当使用 levelAndRefs 语法时。 2024-12-03 07:23:07,891 主要警告 使用 levelAndRefs 语法时,Appender 引用将被忽略 2024-12-03 07:23:07,916 主要错误无法找到插件 CloudWatchAppender 2024-12-03 07:23:07,917 主要错误无法调用 类中的工厂方法 元素的 org.apache.logging.log4j.core.config.AppendersPlugin 附加器:java.lang.NullPointerException java.lang.NullPointerException 位于 org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor.visit(PluginElementVisitor.java:52) 在 org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.generateParameters(PluginBuilder.java:264) 在 org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:137) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1122) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1047) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:651) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:249) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:295) 在 org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:621) 在 org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:694) 在 org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:711) 在 org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:245) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) 在 org.apache.logging.log4j.LogManager.getContext(LogManager.java:176) 在 org.apache.logging.log4j.LogManager.getLogger(LogManager.java:666) 在 org.apache.logging.log4j.LogManager.getRootLogger(LogManager.java:700) 在 org.apache.spark.internal.Logging.initializeLogging(Logging.scala:130) 在 org.apache.spark.internal.Logging.initializeLogIfNecessary(Logging.scala:115) 在 org.apache.spark.internal.Logging.initializeLogIfNecessary$(Logging.scala:109) 在 org.apache.spark.deploy.SparkSubmit.initializeLogIfNecessary(SparkSubmit.scala:75) 在 org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:83) 在 org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1046) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1055) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
2024-12-03 07:23:07,918 主要错误无法找到附加程序“STDOUT” 对于记录器配置“root”2024-12-03 07:23:07,919 主要错误无法 找到记录器配置“root”的附加程序“cloudwatch”2024-12-03 07:23:07,919 主要错误无法找到附加程序“consoleLogger” 记录器配置“sparkapp”2024-12-03 07:23:07,920 主要错误无法 找到记录器配置“sparkapp”的附加程序“CLOUDWATCH”
嗨,我在 ec2 实例上安装了 aws cloudwatch 代理,并将 ec2 实例上的 Spark 应用程序日志推送到 Cloudwatch,而不是 log4j2 附加程序。