我有一个用Java编写的AWS Lambda函数。我想用一个自定义的GraalVM运行时来运行Lambda函数,例如在这篇博客文章中所做的
每当应用程序启动时,我都会收到以下错误:
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [level]
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [logger]
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [msg]
ERROR StatusLogger Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [n]
ERROR StatusLogger Unrecognized conversion specifier [n] starting at position 56 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [level]
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [logger]
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [msg]
ERROR StatusLogger Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [n]
ERROR StatusLogger Unrecognized conversion specifier [n] starting at position 56 in conversion pattern.
这是我的log4j2.xml文件的样子
<Configuration status="WARN">
<Appenders>
<Lambda name="Lambda">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n</pattern>
</PatternLayout>
</Lambda>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Lambda"/>
</Root>
<Logger name="software.amazon.awssdk" level="WARN" />
<Logger name="software.amazon.awssdk.request" level="DEBUG" />
</Loggers>
</Configuration>
这里的其他类似问题表明,这是由于fatjar中存在冲突的log4j包。基于这个答案中的建议,我现在使用shadowJar和一个转换来构建fatjar,GraalVM应用程序就是从中编译的。然而,我仍然得到错误。
gradle构建文件的相关部分如下所示:
dependencies {
implementation platform('software.amazon.awssdk:bom:2.+')
implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.+')
implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
implementation 'com.amazonaws:aws-lambda-java-events:2.2.9'
implementation 'com.amazonaws:aws-xray-recorder-sdk-core'
implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core'
implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2'
implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor'
implementation 'org.apache.logging.log4j:log4j-slf4j18-impl:2.13.2'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.formkiq:lambda-runtime-graalvm:1.1'
implementation project(":aws-java-utilities:utilities")
runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0'
runtimeOnly 'mysql:mysql-connector-java:8.0.+'
// mqttv3 1.1.1 fails to connect for unknown reasons
testImplementation (group: 'org.eclipse.paho', name: 'org.eclipse.paho.client.mqttv3', version: '1.1.0'){force = true}
testImplementation 'com.amazonaws:aws-iot-device-sdk-java:1.3.+'
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2'
testImplementation "org.mockito:mockito-core:2.+"
testImplementation project(":aws-java-utilities:end2endTest-utilities")
testImplementation 'software.amazon.awssdk:rdsdata'
}
shadowJar {
archivesBaseName = project.name + '-lambda'
manifest {
attributes 'Main-Class': 'com.formkiq.lambda.runtime.graalvm.LambdaRuntime'
}
transform(com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer)
}
如果我尝试运行jar(或一个具有相同任务但具有不同主类的构建),我会收到此错误。
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
2021-01-16 19:35:23,290 main ERROR Error processing element Lambda ([Appenders: null]): CLASS_NOT_FOUND
2021-01-16 19:35:23,343 main ERROR Unable to locate appender "Lambda" for logger config "root"
我用于构建 GraalVM 应用程序的命令如下所示
docker run --rm -v $(pwd):/working oracle/graalvm-ce:20.1.0-java11 \
/bin/bash -c "
gu install native-image; \
native-image --enable-url-protocols=http,https \
-H:+AllowIncompleteClasspath \
-H:ReflectionConfigurationFiles=/working/src/main/resources/reflect.json \
-H:IncludeResourceBundles=com.mysql.cj.LocalizedErrorMessages \
-H:IncludeResources=.\*.properties \
-H:IncludeResources=.\*.xml \
-H:+ReportUnsupportedElementsAtRuntime -J-Xmx5G --no-server -jar \"/working/build/libs/$1-lambda-all.jar\";`
gradle依赖
告诉我所有对log4j的引用都使用相同的版本,例如:
...
+--- org.apache.logging.log4j:log4j-slf4j18-impl:2.13.2
| +--- org.slf4j:slf4j-api:1.8.0-beta4
| +--- org.apache.logging.log4j:log4j-api:2.13.2
| \--- org.apache.logging.log4j:log4j-core:2.13.2
| \--- org.apache.logging.log4j:log4j-api:2.13.2
...
我已经看到一些关于这个主题的问题提到,这是由于相互冲突的log4j2插件。dat文件。我可以在依赖项中看到我有两个这样的文件。一个在com.amazonaws:aws-lambda-java-log4j2:1.2.0
中,另一个在org.apache.logging.log4j:log4j api:2.13.2
。根据我之前链接的答案,我的gradle构建中的转换应该会解决这个问题,但我不知道如何验证这是否正确。
我一整天都在绞尽脑汁解决这个问题,我真的不知道如何让测井工作起来。
任何能让我前进的帮助都将不胜感激。
我遇到了和你一样的问题。经过一番挖掘,我偶然发现了这个jira和github问题:
https://issues.apache.org/jira/browse/LOG4J2-2604
https://github.com/oracle/graal/issues/808
使用GraalVM构建时,必须指定要绑定的资源。应用资源配置。github问题中指定的json设置对我有效(但是,reflect-config.json不起作用)。
工作反射配置可以在另一个github问题中找到https://github.com/oracle/graal/issues/2008#issuecomment-777858227
Spring 4.3.30 hibernate 5应用程序。pom.xml具有所有log4j2依赖项。 甚至增加了log4j2.xml 我得到的错误是: 我还错过了什么,因为即使我的模式不包含默认布局,我也一直在出错?我在迁移到log4j之前使用log4jlog4j2.Din计划迁移到log4j2,但由于我必须升级Spring和hibernate,我开始找到ERROR StatusLogger N
我有一个运行在Tomcat 8上的web应用程序的log4j2配置文件,如下所示 我看到我的 Web 应用写入日志文件,但我对线程名称的 %t 模式似乎无法解析,因此我收到这样的日志语句 请注意,我得到%t而不是线程名称 所以为了解决这个问题,我使用选项启动了Tomcat 当webapp正在部署和log4j2正在初始化时,我看到catalina.out中打印出以下消息。 我的web应用程序包含以下
说我想打印: 这是正确的。这: 或者这个: ? 事情是在其他地方,所以我遇到了这样的讨论: -即使ch变为无符号字符,代码的行为也不是由C标准定义的。这是因为无符号字符被提升为int(在普通的C实现中),所以int被传递给printf的说明符%u。但是,%u需要一个无符号int,所以类型不匹配,并且C标准没有定义该行为 -你的评论不正确。C11标准规定转换说明符必须与函数参数本身的类型相同,而不是
xml配置。log4j2.version=2.10.0,Spring Boot版本为1.5.9 log4j2.xml配置
我使用Java8的ZonedDateTime和DateTimeFormatter。当我试图解析自己的模式时,它无法识别并抛出异常。
在使用 handlebars 渲染模板的时候,会传入以下数据: { "args": {}, "config": {}, "project": {}, "spec": {}, "interfaceMockRules": [], "datatypeEnums": [], "ds":{ "views": [], "t