我目前正在 EMR 无服务器上运行 Scala Spark 应用程序,所有日志都输出到 stderr 并记录在信息级别。看看这个页面,这似乎是 Spark 的默认设置;
https://github.com/apache/spark/blob/v3.3.0/conf/log4j2.properties.template
我已经能够根据此处的信息使用这些行调整日志记录级别https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/log4j2.html
"rootLogger.level": "warn"
"logger.myapp.name": "com.myapp",
"logger.myapp.level": "info",
但是一切仍然会输出到 stderr。我将如何配置它以使我的应用程序日志出现在标准输出中?我尝试了以下配置,但没有任何效果。
{
"classification": "spark-executor-log4j2",
"configurations": [],
"properties": {
"rootLogger.level": "warn",
"appender.myapp.target": "stdout",
"appender.myapp.layout.type": "PatternLayout",
"appender.myapp.name": "myapp",
"appender.myapp.type": "Console",
"logger.myapp.name": "com.myapp",
"logger.myapp.level": "info",
"logger.myapp.appenderRef.myappout.ref": "myapp",
"logger.myapp.appenderRefs": "myappout"
}
}
尝试定义附加程序以指向
stdout
。并确保您正确定义 PatternLayout
来控制日志消息格式。
此外,将定义的附加程序与记录器相关联。
appenderRef
应指向定义的附加程序。{
"classification": "spark-executor-log4j2",
"configurations": [],
"properties": {
"rootLogger.level": "warn",
"rootLogger.appenderRef.stdout.ref": "stdout",
"appender.stdout.type": "Console",
"appender.stdout.name": "stdout",
"appender.stdout.layout.type": "PatternLayout",
"appender.stdout.layout.pattern": "%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n",
"appender.stdout.target": "SYSTEM_OUT",
"logger.myapp.name": "com.myapp",
"logger.myapp.level": "info",
"logger.myapp.additivity": "false",
"logger.myapp.appenderRef.stdout.ref": "stdout"
}
}
logger.myapp.additivity
设置为 false
,以防止日志传播到根记录器,确保它们仅发送到 logger.myapp
中定义的附加程序。
stdout
附加程序与根记录器和myapp
记录器关联,以确保来自根记录器和myapp
记录器的日志都发送到stdout
。
根记录器配置为具有
warn
级别,并将其与 stdout
附加程序关联,以确保与其他记录器不匹配的类中级别为 warn
或更高级别的所有日志都将转到 stdout
。