当前位置: 首页 > 知识库问答 >
问题:

Logback Groovy配置和GraalVM

汪典
2023-03-14

我正在尝试使用groovy配置文件进行GraalVM编译的应用程序使用的logback。

当运行它并正常编译它时,一切都很好,但当我试图针对Graal进行编译时,我面临着一些我无法理解如何解决的问题。

因此,在没有任何特定配置传递给Graal的情况下,我在编译过程中遇到以下错误:

Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of net.logstash.logback.encoder.LogstashEncoder are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized by the io.micr
onaut.runtime.Micronaut class initializer with a trace: 
        at net.logstash.logback.encoder.LogstashEncoder.<init>(LogstashEncoder.java:27)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:80)
        at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:74)
        at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1732)
        at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1556)

我尝试了非常懒惰的方法,通过这样做来允许在构建期间初始化类:

——在构建时初始化=net。logstash。回复。编码器。LogstashEncoder

这只会导致其他各种与日志存储相关的类需要这个选项,所以我继续为整个包添加了一条规则,如下所示:

——在构建时初始化=net。logstash。回写

这并没有解决问题,但在编译过程中又导致了以下错误:

com.oracle.svm.core.util.UserError$UserException: Classes that should be initialized at run time got initialized during image building:
 ch.qos.logback.classic.gaffer.GafferConfigurator the class was requested to be initialized at build time (from the command line). ch.qos.logback.classic.gaffer.GafferConfigurator has been initialized without the native-image initialization instrumentation and the stack trace can't be tracked. Try avoiding to initialize the class that caused initialization of ch.qos.logback.classic.gaffer.GafferConfiguratorgroovy.lang.GroovySystem the class was requested to be initialized at build time (from the command line). io.micronaut.runtime.Micronaut caused initialization of this class with the following trace:
        at ch.qos.logback.classic.gaffer.GafferConfigurator.$getStaticMetaClass(GafferConfigurator.groovy)
        at ch.qos.logback.classic.gaffer.GafferConfigurator.<init>(GafferConfigurator.groovy)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at ch.qos.logback.classic.gaffer.GafferUtil.newGafferConfiguratorInstance(GafferUtil.java:52)
        at ch.qos.logback.classic.gaffer.GafferUtil.runGafferConfiguratorOn(GafferUtil.java:41)
        at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:67)
        at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
        at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
        at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
        at io.micronaut.runtime.Micronaut.<clinit>(Micronaut.java:46)

我尝试了关于允许和不允许在构建或运行时初始化的各种规则排列,但都不起作用。

所以我的问题是,我该如何克服这一点?我试图找出导致初始化的类,但目前还无法做到这一点。

有人设法让logback使用groovy配置文件并成功编译成GraalVM映像吗?

共有1个答案

胡意致
2023-03-14

由于Groovy的动态性,在GraalVM nativeimage上运行起来比较困难(但并非不可能)。我建议您通过跟踪代理运行应用程序,并查看需要什么反射配置才能获得日志。groovy文件操作。

将应用程序构建到JAR中,并使用以下方法运行应用程序:

java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar build/myjar-all.jar

然后查看生成的reflect配置。json文件,用于获取与logback相关的条目,并将其包含在配置中。

或者,您可以使用logback来避免麻烦。xml

 类似资料:
  • 我有教育问题: 存在具有windows server 2003(AD)的虚拟机,其中包含用户及其密码。已建立与机器的连接(ip:192.168.56.101:389)。 Web应用程序的目的是使用户能够在AD中更改他的密码。 问题:无法配置到windws server 2003的连接。 我从这个教程开始https://spring.io/guides/gs/authenticating-ldap/

  • 我一直在运行Ubuntu 12的本地开发机器上工作,开发一个Symfony2.3.5应用程序。 在我上传代码并遇到以下问题之前,一切都很顺利: 服务器当前运行以下内容: 在WHM中,我已经通过EasyApache安装程序安装了,但我仍然会遇到这个错误。 这安装了。我的开发版本是4.8.1,所以大约更新了10年。 ICU版本是问题所在吗?这是我唯一能看到的东西。 我构建的应用程序仅为。它不需要使用英

  • 可能更多的是试图克服学习曲线和实际代码问题。我很抱歉,如果这似乎是努比什,目前我在生产中得到这个错误。 基本上,我一直收到这个“redis池太小了”,我迷失了从哪里开始,我实际上迷失了基本上理解如何准确地用美洲狮或配置后的任何东西,如缩放等。 下面是我收到的错误后的配置。 procfileweb:bundle exec puma-C config/puma.rb worker:bundle exe

  • 从 webstorm 官网下载对应系统的安装包,webstorm 有 30 天的免费试用期,建议购买,不想购买网上也有注册机资源,可以自行搜索。 Webstorm 的默认字体和配色相当糟糕,你可以手动修改 Webstorm 的配置。 点击 “File” -> “Setting”: Webstorm 的配置项极其丰富,建议善用搜索,比如修改主题,只要输入 “color” : 可以配置颜色主题与字体,

  • 要想使用SystemTap,需要安装跟目标内核版本匹配的-devel、-debuginfo和-debuginfo-common-arch包。如果要在不止一个内核上运行SystemTap,需要根据每个内核的版本安装对应的-devel和-debuginfo包。 接下来的几个小节里,我们会详细讲解这一过程。(译注:SystemTap的wiki里面有针对Linux各发行版的安装步骤。本节内容仅适用于RHE

  • 你可能会想知道系统提示您登录时登录表单从哪里来的,因为我们都没有提供任何的HTML或JSP文件。由于Spring Security的默认配置并没有明确设定一个登录页面的URL,Spring Security自动生成一个,基于这个功能被启用,使用默认URL处理登录的提交内容,登录后跳转的URL等等。 自动生成的登录页面可以方便应用的快速启动和运行,大多数应用程序都需要提供自己的登录页面。要做到这一点