У меня есть функция AWS Lambda, написанная на Java. Я хочу запустить функцию Lambda с пользовательской средой выполнения GraalVM, как это делается в этот пост в блоге например
Всякий раз, когда приложение запускается, я получаю следующие ошибки:
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>
Другие подобные вопросы здесь предполагают, что это связано с конфликтующими пакетами 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)
}
Если я попытаюсь запустить банку (или одну сборку с той же задачей, но с другим основным классом), я получу эту ошибку.
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 dependencies
покажите мне, что все ссылки на что-либо с 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
...
Я видел, что в некоторых вопросах по этой теме упоминается, что это связано с конфликтующими файлами Log4j2Plugins.dat. Я вижу в своих зависимостях, что у меня есть два таких файла. Один в com.amazonaws:aws-lambda-java-log4j2:1.2.0
и один в org.apache.logging.log4j:log4j-api:2.13.2
. Согласно предыдущему ответу, который я связал, преобразование в моей сборке gradle должно позаботиться об этом, но я не знаю, как проверить, правда ли это.
Я бился головой об этой проблеме весь день, и я в полной растерянности относительно того, как заставить ведение журнала работать.
Любая помощь, чтобы продвинуть меня вперед, будет высоко оценена.