quarkiverse / quarkus-logging-logback Goto Github PK
View Code? Open in Web Editor NEWQuarkus Logback extension
License: Apache License 2.0
Quarkus Logback extension
License: Apache License 2.0
Hello,
as i told you in the google group :
https://groups.google.com/g/quarkus-dev/c/dr0tPawdbhQ
I'm having an issue with a quarkus sample project using quarkus logging logback , JVM mode
when i add this kind of Policy :
< r o l l i n g P o l i c y class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
An error occurs :
Cannot read field "fileNamePattern" because "this.tbrp" is null
(tbrp means TimeBasedRollingPolicy i suppose)
I made a zip quarkus-sample-log.zip of my project (intellij with quarkus configuration)
I explain in the README.md fil how to reproduce the issue, hope it will help ...
I am testing the library and it works just fine in dev, but when I run my jar I get this:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Should slf4j dependencies (below) be added manually in order to work out?
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${version}</version>
</dependency>
Thanks!
Hello,
I wanted to know if it is possible to specify a different logback xml file via command line
something like java jar app.jar -Dlogging.config=some-other-logback.xml
or via application properties (?).
Also, for Docker usage in pom:
<docker.command.suffix>--logging.config=file:./config/logback.xml</docker.command.suffix>
I looked into the lib code and didnt find implementation for this.
Thank you!
Variables in logback.xml are being replaced fine from application.properties but not from environment variables.
Works in JVM mode but not in native mode.
Interesting extension, but how does it work?
I suppose it is adapting logback config to jboss-logging instead of making logback the actual logging backend, no?
So things like TurboFilter won't work?
Some docs on this would come in handy.
The quarkus logback extension could mention more clearly that you still need to add the logback jars
I need a different setup depending on the quarkus profile set, something like this exists for Spring boot already:
https://stackoverflow.com/questions/57596037/how-to-select-logback-appender-based-on-property-file-or-environment-variable
Also, we would need access to the current Quarkus profile system variable from the logback appender.
SECRET
backend
${quarkus.profile}
0.9
Hello ,
When i try to build my quarkus application with native mode i have this error ( on jvm mode it's work fine )
java.lang.IllegalStateException: FileNamePattern [/tmp/project-thm/thm-requests.%i.log.zip] does not contain a valid IntegerToken
My logback appender :
<appender name="RequestLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/thm-requests.log</File>
<encoder>
<pattern>%d{"yyyy-MM-dd HH:mm:ss,SSS"};%X{correlationId};%m%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${LOG_PATH}/thm-requests.%i.log.zip</fileNamePattern>
<maxIndex>20</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
</appender>
Any idea to solve this problem ?
Thanks
Hello @stuartwdouglas ,
I want to use the logback variable substitution feature. Unfortunately it does not work as expected.
I created an example project here
package org.acme;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path("/hello")
public class GreetingResource {
private final Logger log = LoggerFactory.getLogger(GreetingResource.class);
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
log.debug("Hello Logback Debug Level");
log.info("Hello Logback Info Level");
log.warn("Hello Logback Warn Level");
return "Hello from RESTEasy";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false">
<appender name="Appender" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) [%blue(%t)] %highlight(%-5level)[ traceId=%X{traceId} spanId=%X{spanId} ] %yellow(%C{1}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<if condition='property("QUARKUS_PROFILE").contains("production")'>
<then>
<root>
<level value="WARN"/>
<appender-ref ref="Appender"/>
</root>
</then>
<else>
<root>
<level value="DEBUG"/>
<appender-ref ref="Appender"/>
</root>
</else>
</if>
</configuration>
11:42:10,387 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
11:42:10,389 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender$$delayed]
11:42:10,390 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [Appender]
11:42:10,397 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - This appender no longer admits a layout as a sub-component, set an encoder instead.
11:42:10,397 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
11:42:10,397 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
11:42:10,465 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to DEBUG
11:42:10,465 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [Appender] to Logger[ROOT]
11:42:10,465 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
2022-12-15 11:42:10,824 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: quarkus-logback-janino 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.14.3.Final) started in 2.411s. Listening on: http://localhost:8080
2022-12-15 11:42:10,827 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: Profile dev activated. Live Coding activated.
2022-12-15 11:42:10,827 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: Installed features: [cdi, logging-logback, resteasy, smallrye-context-propagation, vertx]
2022-12-15 11:42:18,623 [executor-thread-0] INFO [ traceId= spanId= ] o.a.GreetingResource: Hello Logback Info Level
2022-12-15 11:42:18,623 [executor-thread-0] WARN [ traceId= spanId= ] o.a.GreetingResource: Hello Logback Warn Level
As you can see, logback sets the root logger to debug, but the loglevel debug is not printed
I don't understand why this happens. Can you explain what I did wrong?
Quarkus version is hardcoded inside extension and cause of the problem after migration to new quarkus(2.3.0.Final at the moment).
stacktrace:
Execution failed for task ':quarkusGenerateCode'.
> Could not resolve all dependencies for configuration ':quarkusDeploymentConfiguration'.
> Could not resolve io.quarkus:quarkus-arc:2.3.0.Final.
Required by:
project :
> Cannot choose between the following variants of io.quarkus:quarkus-arc:2.3.0.Final:
- io.quarkus:quarkus-arc-deployment:2.1.1.Final
- io.quarkus:quarkus-arc-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-arc-deployment:2.1.1.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-arc-deployment:2.3.0.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
> Could not resolve io.quarkus:quarkus-core:2.1.1.Final.
Required by:
project :
> Cannot choose between the following variants of io.quarkus:quarkus-core:2.3.0.Final:
- io.quarkus:quarkus-core-deployment:2.1.1.Final
- io.quarkus:quarkus-core-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-core-deployment:2.1.1.Final' capability io.quarkus:quarkus-core-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-core-deployment:2.3.0.Final' capability io.quarkus:quarkus-core-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
> Could not resolve io.quarkus:quarkus-arc:2.1.1.Final.
Required by:
project :
> Cannot choose between the following variants of io.quarkus:quarkus-arc:2.3.0.Final:
- io.quarkus:quarkus-arc-deployment:2.1.1.Final
- io.quarkus:quarkus-arc-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-arc-deployment:2.1.1.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-arc-deployment:2.3.0.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
> Could not resolve io.quarkus:quarkus-core:2.3.0.Final.
Required by:
project :
> Cannot choose between the following variants of io.quarkus:quarkus-core:2.3.0.Final:
- io.quarkus:quarkus-core-deployment:2.1.1.Final
- io.quarkus:quarkus-core-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-core-deployment:2.1.1.Final' capability io.quarkus:quarkus-core-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-core-deployment:2.3.0.Final' capability io.quarkus:quarkus-core-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
> Could not resolve io.quarkus:quarkus-arc:2.3.0.Final.
Required by:
project : > io.quarkus:quarkus-universe-bom:2.3.0.Final
> Cannot choose between the following variants of io.quarkus:quarkus-arc:2.3.0.Final:
- io.quarkus:quarkus-arc-deployment:2.1.1.Final
- io.quarkus:quarkus-arc-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-arc-deployment:2.1.1.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-arc-deployment:2.3.0.Final' capability io.quarkus:quarkus-arc-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
> Could not resolve io.quarkus:quarkus-core:2.1.1.Final.
Required by:
project : > io.quarkus:quarkus-universe-bom:2.3.0.Final
> Cannot choose between the following variants of io.quarkus:quarkus-core:2.3.0.Final:
- io.quarkus:quarkus-core-deployment:2.1.1.Final
- io.quarkus:quarkus-core-deployment:2.3.0.Final
All of them match the consumer attributes:
- Variant 'io.quarkus:quarkus-core-deployment:2.1.1.Final' capability io.quarkus:quarkus-core-deployment-capability:2.1.1.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
- Variant 'io.quarkus:quarkus-core-deployment:2.3.0.Final' capability io.quarkus:quarkus-core-deployment-capability:2.3.0.Final:
- Unmatched attribute:
- Provides org.gradle.status 'release' but the consumer didn't ask for it
I changed quarkus version for logback extension and build it locally, seems all functionality works properly.
Would be good to force this extension to inherit version of quarkus from the project and do not worry about it in the future.
I have quarkus-logging-logback configured and a logback.xml.
When I run this locally on my computer, there appears a file "null" with the log in it in the project root.
I've just added quarkus-logback but get this error on startup:
Caused by: java.lang.RuntimeException: ch.qos.logback:logback-core version 1.2.9 is not compatible with quarkus-logback which requires at least 1.2.10 please use the correct logback version
Which comes from:
+--- io.quarkus:quarkus-universe-bom:2.7.5.Final
| +--- ch.qos.logback:logback-core:1.2.9 (c)
when I try set a strict version:
// ch.qos.logback:logback-core version 1.2.9 is not compatible with quarkus-logback
// which requires at least 1.2.10 please use the correct logback version.
implementation("ch.qos.logback:logback-core") {
version {
strictly '1.2.10'
}
}
I get a dependency mismatch:
Could not determine the dependencies of task ':compileJava'.
> Could not resolve all dependencies for configuration ':quarkusDependency'.
> Could not resolve ch.qos.logback:logback-core:{strictly 1.2.10}.
Required by:
project :
> Cannot find a version of 'ch.qos.logback:logback-core' that satisfies the version constraints:
Dependency path 'com.ono:example:unspecified' --> 'ch.qos.logback:logback-core:{strictly 1.2.10}'
Constraint path 'com.ono:example:unspecified' --> 'io.quarkus:quarkus-universe-bom:2.7.5.Final' (enforced-platform-runtime) --> 'ch.qos.logback:logback-core:1.2.9'
> Could not resolve ch.qos.logback:logback-core:1.2.9.
Required by:
project : > io.quarkus:quarkus-universe-bom:2.7.5.Final
> Cannot find a version of 'ch.qos.logback:logback-core' that satisfies the version constraints:
Dependency path 'com.ono:example:unspecified' --> 'ch.qos.logback:logback-core:{strictly 1.2.10}'
Constraint path 'com.ono:example:unspecified' --> 'io.quarkus:quarkus-universe-bom:2.7.5.Final' (enforced-platform-runtime) --> 'ch.qos.logback:logback-core:1.2.9'
It would be great to be able to dynamically define the target(s) to log to depending on the current environment.
On DEV and TEST I do want to log on the console, on staging and prod I do want to log to a remote logging SaaS (Bugsnag).
At the moment I am doing this like this:
<root level="ERROR">
<appender-ref ref="${LOGBACK_APPENDER:-STDOUT}"/>
<appender-ref ref="FILE-ROLLING"/>
</root>
--
So I have to set -DLOGBACK_APPENDER=BUGSNAG in the docker file, and "STDOUT" is the default.
This works, but it would be much nicer to define this centrally in the application.properties, which support different environments now also anyway.
so in application-prod.properties I would set:
-DLOGBACK_APPENDER=STDOUT
This way I could toggle between STDOUT logging and "SaaS Logging".
Even nicer(!) would be to define a whole collection of loggers for each environment, but at this point with the default logback configuration I wouldnt really know how to make that work.
Example:
PROD Logging:
File Rolling, Bugsnag
STAGING LOGGING:
Bugsnag
DEV, TEST Logging:
STDOUT
I'm getting this error while running tests on 3.1.0.Final.
Everything works with previous release.
Caused by: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor#init threw an exception: java.lang.NoSuchMethodError: 'io.quarkus.bootstrap.model.AppModel io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem.getEffectiveModel()'
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.init(LoggingLogbackProcessor.java:190)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:909)
at io.quarkus.builder.BuildContext.run(BuildContext.java:282)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:335)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
at io.quarkus.test.junit.QuarkusTestExtension.doJavaStart(QuarkusTestExtension.java:223)
at io.quarkus.test.junit.QuarkusTestExtension.ensureStarted(QuarkusTestExtension.java:607)
at io.quarkus.test.junit.QuarkusTestExtension.beforeAll(QuarkusTestExtension.java:655)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$12(ClassBasedTestDescriptor.java:395)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:395)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:211)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:84)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:148)
... 37 more
java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor#init threw an exception: java.lang.NoClassDefFoundError: io/quarkus/bootstrap/resolver/update/DefaultArtifactVersion
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.doVersionCheck(LoggingLogbackProcessor.java:196)
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.init(LoggingLogbackProcessor.java:92)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:882)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:833)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: java.lang.ClassNotFoundException: io.quarkus.bootstrap.resolver.update.DefaultArtifactVersion
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:464)
at io.quarkus.bootstrap.classl
Hi everyonе, In our project automatically changed <quarkus-logging-logback.version>0.13.0</quarkus-logging-logback.version> to <quarkus-logging-logback.version>1.0.0</quarkus-logging-logback.version> and added
org.slf4j
slf4j-api
${slf4j.version}
dependency version <slf4j.version>2.0.5</slf4j.version>, and after can't seen logs.
I fixed that with upgrading dependency slf4j.jboss.logmanager from 1.x.x version to <slf4j.jboss.logmanager>2.0.1.Final</slf4j.jboss.logmanager>.
org.jboss.slf4j
slf4j-jboss-logmanager
${slf4j.jboss.logmanager}
Maybe this update was previously passed automatically?
Hello,
There apparently a class loading issue when using a Logback console appender.
Steps to reproduce:
quarkiverse/quarkus-logging-logback
quarkus-logging-logback/integration-tests/pom.xml
change quarkus-logging-logback
version to 0.13.0quarkus-logging-logback/integration-tests/src/main/resources/logback.xml
file's contents with the following:<configuration debug="true">
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>target/tests.log</file>
<append>false</append>
<encoder>
<pattern>LOGBACK- %-5level %msg %n</pattern>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{HH:mm:ss.SSS} %gray(\(%t\)) %green(%-5level) %highlight([%logger{36}]) %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
mvn clean verify -Dnative
in directory quarkus-logging-logback/integration-tests
...
...
06:36:26,912 |-ERROR in ch.qos.logback.core.pattern.parser.Compiler@53307460 - [msg] is not a valid conversion word
06:36:26,912 |-ERROR in ch.qos.logback.core.pattern.parser.Compiler@53307460 - Failed to instantiate converter class [ch.qos.logback.classic.pattern.LineSeparatorConverter] for keyword [n] ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.classic.pattern.LineSeparatorConverter
at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.classic.pattern.LineSeparatorConverter
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:68)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:44)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:33)
at at ch.qos.logback.core.pattern.parser.Compiler.createConverter(Compiler.java:104)
at at ch.qos.logback.core.pattern.parser.Compiler.compile(Compiler.java:63)
at at ch.qos.logback.core.pattern.parser.Parser.compile(Parser.java:87)
at at ch.qos.logback.core.pattern.PatternLayoutBase.start(PatternLayoutBase.java:84)
at at ch.qos.logback.classic.encoder.PatternLayoutEncoder.start(PatternLayoutEncoder.java:28)
at at ch.qos.logback.classic.encoder.PatternLayoutEncoder$$delayed.doQuarkusDelayedStart(Unknown Source)
at at io.quarkiverse.logback.runtime.LogbackRecorder.createHandler(LogbackRecorder.java:130)
at at io.quarkus.deployment.steps.LoggingLogbackProcessor$handler1311068917.deploy_0(Unknown Source)
at at io.quarkus.deployment.steps.LoggingLogbackProcessor$handler1311068917.deploy(Unknown Source)
at at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
at at io.quarkus.runtime.Application.start(Application.java:101)
at at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:103)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:120)
at at io.quarkus.runner.GeneratedMain.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.classic.pattern.LineSeparatorConverter
at at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:52)
at at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at at java.lang.ClassLoader.loadClass(ClassLoader.java:133)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:55)
at ... 18 common frames omitted
06:36:26,913 |-ERROR in ch.qos.logback.core.pattern.parser.Compiler@53307460 - [n] is not a valid conversion word
%PARSER_ERROR[d] %PARSER_ERROR[gray] %PARSER_ERROR[green] %PARSER_ERROR[highlight] %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[d] %PARSER_ERROR[gray] %PARSER_ERROR[green] %PARSER_ERROR[highlight] %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[d] %PARSER_ERROR[gray] %PARSER_ERROR[green] %PARSER_ERROR[highlight] %PARSER_ERROR[msg]%PARSER_ERROR[n][INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.981 s - in io.quarkiverse.logging.logback.it.NativeLoggingLogbackResourceIT
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-failsafe-plugin:2.22.2:verify (default) @ quarkus-logging-logback-integration-tests ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:57 min
[INFO] Finished at: 2022-08-11T09:36:28+03:00
[INFO] ------------------------------------------------------------------------
Do you have any suggestion what could be done about this?
Thanks!
Hello @stuartwdouglas ,
When the application is compiled native, the pattern in ConsoleAppender does not work. Everything is fine, when running in JVM mode.
I created an example here, to reproduce it.
Quarkus=2.14.3.Final
quarkus-logging-logback=0.13.0
GraalVm=22.3.0
Java=17
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false">
<appender name="Appender" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) [%blue(%t)] %highlight(%-5level)[ traceId=%X{traceId} spanId=%X{spanId} ] %yellow(%C{1}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="Appender"/>
</root>
</configuration>
arl@fedora ~/sources/quarkus/quarkus-logback-native $ ./gradlew quarkusDev
> Task :quarkusDev
Listening for transport dt_socket at address: 5005
Press [h] for more options>
Tests paused
Press [r] to resume testing, [h] for more options>
Press [r] to resume testing, [o] Toggle test output, [h] for more options>
07:46:19,579 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
07:46:19,582 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender$$delayed]
07:46:19,583 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [Appender]
07:46:19,591 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - This appender no longer admits a layout as a sub-component, set an encoder instead.
07:46:19,591 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
07:46:19,591 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
07:46:19,591 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to INFO
07:46:19,591 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [Appender] to Logger[ROOT]
07:46:19,591 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
2022-12-14 07:46:19,884 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: quarkus-logback-native 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.14.3.Final) started in 1.639s. Listening on: http://localhost:8080
2022-12-14 07:46:19,887 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: Profile dev activated. Live Coding activated.
2022-12-14 07:46:19,888 [Quarkus Main Thread] INFO [ traceId= spanId= ] i.q.b.r.Timing: Installed features: [cdi, logging-logback, resteasy, smallrye-context-propagation, vertx]
2022-12-14 07:49:04,056 [executor-thread-0] INFO [ traceId= spanId= ] o.a.GreetingResource: Hello Logback
arl@fedora ~/sources/quarkus/quarkus-logback-native $ build/quarkus-logback-native-1.0.0-SNAPSHOT-runner
%PARSER_ERROR[black] [%PARSER_ERROR[blue]] %PARSER_ERROR[highlight][ traceId=%PARSER_ERROR[X] spanId=%PARSER_ERROR[X] ] %PARSER_ERROR[yellow]: %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[throwable]%PARSER_ERROR[black] [%PARSER_ERROR[blue]] %PARSER_ERROR[highlight][ traceId=%PARSER_ERROR[X] spanId=%PARSER_ERROR[X] ] %PARSER_ERROR[yellow]: %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[throwable]%PARSER_ERROR[black] [%PARSER_ERROR[blue]] %PARSER_ERROR[highlight][ traceId=%PARSER_ERROR[X] spanId=%PARSER_ERROR[X] ] %PARSER_ERROR[yellow]: %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[throwable]
%PARSER_ERROR[black] [%PARSER_ERROR[blue]] %PARSER_ERROR[highlight][ traceId=%PARSER_ERROR[X] spanId=%PARSER_ERROR[X] ] %PARSER_ERROR[yellow]: %PARSER_ERROR[msg]%PARSER_ERROR[n]%PARSER_ERROR[throwable]
arl@fedora ~/sources/quarkus/quarkus-logback-native $ ./gradlew build -Dquarkus.package.type=native
Starting a Gradle Daemon, 1 stopped Daemon could not be reused, use --status for details
========================================================================================================================
GraalVM Native Image: Generating 'quarkus-logback-native-1.0.0-SNAPSHOT-runner' (executable)...
========================================================================================================================
[1/7] Initializing... (5.3s @ 0.16GB)
Version info: 'GraalVM 22.3.0 Java 17 CE'
Java version info: '17.0.5+8-jvmci-22.3-b08'
C compiler: gcc (redhat, x86_64, 12.2.1)
Garbage collector: Serial GC
3 user-specific feature(s)
- io.quarkus.runner.Feature: Auto-generated class by Quarkus from the existing extensions
- io.quarkus.runtime.graal.DisableLoggingFeature: Disables INFO logging during the analysis phase for the [org.jboss.threads] categories
- io.quarkus.runtime.graal.ResourcesFeature: Register each line in META-INF/quarkus-native-resources.txt as a resource on Substrate VM
07:52:21,011 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
07:52:21,038 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender$$delayed]
07:52:21,039 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [Appender]
07:52:21,043 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - This appender no longer admits a layout as a sub-component, set an encoder instead.
07:52:21,043 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
07:52:21,043 |-WARN in ch.qos.logback.core.ConsoleAppender$$delayed[Appender] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
07:52:21,043 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to INFO
07:52:21,043 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [Appender] to Logger[ROOT]
07:52:21,043 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
[2/7] Performing analysis... [*******] (25.8s @ 3.28GB)
10,647 (89.34%) of 11,917 classes reachable
15,295 (58.22%) of 26,273 fields reachable
52,427 (55.21%) of 94,959 methods reachable
468 classes, 122 fields, and 2,128 methods registered for reflection
63 classes, 68 fields, and 55 methods registered for JNI access
4 native libraries: dl, pthread, rt, z
[3/7] Building universe... (3.9s @ 1.45GB)
[4/7] Parsing methods... [**] (2.7s @ 4.51GB)
[5/7] Inlining methods... [***] (1.7s @ 1.92GB)
[6/7] Compiling methods... [*****] (22.0s @ 3.10GB)
[7/7] Creating image... (3.4s @ 4.50GB)
19.66MB (48.32%) for code area: 33,584 compilation units
20.72MB (50.92%) for image heap: 265,698 objects and 10 resources
320.80KB ( 0.77%) for other data
40.69MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area: Top 10 object types in image heap:
1.62MB sun.security.ssl 4.38MB byte[] for code metadata
968.05KB java.util 2.52MB java.lang.Class
729.28KB java.lang.invoke 2.45MB java.lang.String
718.49KB com.sun.crypto.provider 2.16MB byte[] for general heap data
450.56KB sun.security.x509 1.92MB byte[] for java.lang.String
444.83KB java.lang 914.98KB com.oracle.svm.core.hub.DynamicHubCompanion
401.21KB java.util.concurrent 644.77KB java.util.HashMap$Node
398.19KB java.io 541.26KB byte[] for reflection metadata
394.59KB io.netty.buffer 481.15KB java.lang.String[]
338.80KB io.netty.handler.codec.http2 394.54KB byte[] for embedded resources
13.06MB for 399 more packages 4.10MB for 2582 more object types
------------------------------------------------------------------------------------------------------------------------
2.7s (3.8% of total time) in 28 GCs | Peak RSS: 5.99GB | CPU load: 8.38
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
/home/arl/sources/quarkus/quarkus-logback-native/build/quarkus-logback-native-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-logback-native-1.0.0-SNAPSHOT-runner (executable)
/home/arl/sources/quarkus/quarkus-logback-native/build/quarkus-logback-native-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-logback-native-1.0.0-SNAPSHOT-runner-build-output-stats.json (json)
/home/arl/sources/quarkus/quarkus-logback-native/build/quarkus-logback-native-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-logback-native-1.0.0-SNAPSHOT-runner-timing-stats.json (raw)
/home/arl/sources/quarkus/quarkus-logback-native/build/quarkus-logback-native-1.0.0-SNAPSHOT-native-image-source-jar/quarkus-logback-native-1.0.0-SNAPSHOT-runner.build_artifacts.txt (txt)
========================================================================================================================
Finished generating 'quarkus-logback-native-1.0.0-SNAPSHOT-runner' in 1m 9s.
BUILD SUCCESSFUL in 1m 20s
9 actionable tasks: 2 executed, 7 up-to-date
Hello,
When in the logback.xml I use a composite converter, for example:
<conversionRule conversionWord="sensitiveDataReplace"
converterClass="org.acme.getting.started.SensitiveDataReplacingConverter"/>
then when Quarkus starts in dev mode, I get the following stacktrace:
17:41:22,532 |-ERROR in ch.qos.logback.core.pattern.parser.Compiler@3baabbe6 - Failed to instantiate converter class [org.acme.getting.started.SensitiveDataReplacingConverter] as a composite converter for keyword [sensitiveDataReplace] ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.acme.getting.started.SensitiveDataReplacingConverter
at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.acme.getting.started.SensitiveDataReplacingConverter
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:69)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:45)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:34)
at at ch.qos.logback.core.pattern.parser.Compiler.createCompositeConverter(Compiler.java:129)
at at ch.qos.logback.core.pattern.parser.Compiler.compile(Compiler.java:47)
at at ch.qos.logback.core.pattern.parser.Parser.compile(Parser.java:87)
at at ch.qos.logback.core.pattern.PatternLayoutBase.start(PatternLayoutBase.java:84)
at at net.logstash.logback.pattern.PatternLayoutAdapter.start(PatternLayoutAdapter.java:100)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.buildLayout(AbstractJsonPatternParser.java:224)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.makeLayoutValueGetter(AbstractJsonPatternParser.java:197)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.makeComputableValueGetter(AbstractJsonPatternParser.java:183)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.parseNode(AbstractJsonPatternParser.java:317)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.parseObject(AbstractJsonPatternParser.java:371)
at at net.logstash.logback.pattern.AbstractJsonPatternParser.parse(AbstractJsonPatternParser.java:300)
at at net.logstash.logback.composite.AbstractPatternJsonProvider.initializeNodeWriter(AbstractPatternJsonProvider.java:104)
at at net.logstash.logback.composite.AbstractPatternJsonProvider.start(AbstractPatternJsonProvider.java:85)
at at net.logstash.logback.composite.JsonProviders.start(JsonProviders.java:48)
at at net.logstash.logback.composite.AbstractCompositeJsonFormatter.start(AbstractCompositeJsonFormatter.java:119)
at at net.logstash.logback.encoder.CompositeJsonEncoder.start(CompositeJsonEncoder.java:129)
at at net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder$$delayed.doQuarkusDelayedStart(Unknown Source)
at at io.quarkiverse.logback.runtime.LogbackRecorder.createHandler(LogbackRecorder.java:130)
at at io.quarkus.deployment.steps.LoggingLogbackProcessor$handler1311068917.deploy_0(Unknown Source)
at at io.quarkus.deployment.steps.LoggingLogbackProcessor$handler1311068917.deploy(Unknown Source)
at at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
at at io.quarkus.runtime.Application.start(Application.java:101)
at at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:103)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:120)
at at io.quarkus.runner.GeneratedMain.main(Unknown Source)
at at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:103)
at at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassNotFoundException: org.acme.getting.started.SensitiveDataReplacingConverter
at at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:438)
at at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:414)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:56)
at ... 35 common frames omitted
The app does work, however the log appender that uses the converter of course does not work as expected.
Interestingly, when I run in prod mode with ./mvnw package -Dquarkus.package.type=uber-jar
and java -jar target/*-runner.jar
, there's no stacktrace and the appender and the converter work as expected.
Reproduces on linux with the this code https://github.com/peterhuba/quarkus-logback-issues (latest commit on master).
Do you have any clue? Thanks!
Hi,
We are using this extension to use Logback to configure Quarkus logging via logback.xml. We have identical logback.xml configurations across different microservices to have a uniform logging stack and output, including, timestamp, level, logger, line, method and message. We noticed that the method name and line number are displayed as questions marks.
This is the case when logback
is not able to find the caller data.
For example in MethodOfCallerConverter
public class MethodOfCallerConverter extends ClassicConverter {
public String convert(ILoggingEvent le) {
StackTraceElement[] cda = le.getCallerData();
if (cda != null && cda.length > 0) {
return cda[0].getMethodName();
} else {
return CallerData.NA;
}
}
}
Digging into quarkiverse/quarkus-logging-logback
we found that the caller data is silently dropped in LoggingEventWrapper:
@Override
public StackTraceElement[] getCallerData() {
return null;
}
@Override
public boolean hasCallerData() {
return false;
}
Dont drop the caller data but forward it. Simple, but inefficient proposal:
@Override
public StackTraceElement[] getCallerData() {
return new StackTraceElement[] {
new StackTraceElement(
null,
logRecord.getSourceModuleName(),
logRecord.getSourceModuleVersion(),
logRecord.getSourceClassName(),
logRecord.getSourceMethodName(),
logRecord.getSourceFileName(),
logRecord.getSourceLineNumber()
)
};
}
@Override
public boolean hasCallerData() {
return getCallerData() != null;
}
quarkus
: 2.8.1.Final
quarkus-logging-logback
: 0.12.0
logback
: 1.2.11
Hi ,
After configuring the logback.xml file , my customize kafka appender is starting successfully ,
But while appending any log , appender calls method of LoggingEventWrapper class
public LoggerContextVO getLoggerContextVO() {
return null;
}
which always return null, and kafka appender get fails, i am using the standard lib for kafka appender , so i am not able to change in it.
Thanks for the help!!
When integrate quarkus-logging-logback + loki-logback-appender
Quarkus
It occurs when "quarkus.console.color=true" the caller class name and method name maybe null,
and LoggingEventWrapper.java trigger StackTraceElement.java constrcutor method raise NPE. "Objects.requireNonNull(...)"
=> format: "%d{HH:mm:ss.SSS} %-5p [${quarkus.profile}] [%t] [%C{0.}.%M():%L] %s%e%n"
=> log e.g. "11:08:46.617 INFO [dev] [Quarkus Main Thread] [null.null():-1] QuarkusMain main method"
11:08:46,815 |-INFO in io.quarkiverse.logback.runtime.LogbackRecorder$1@61cac409 - Registering current configuration as safe fallback point
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
11:08:46.617 INFO [dev] [Quarkus Main Thread] [null.null():-1] QuarkusMain main method
11:08:47,139 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender$$delayed[FILE] - Appender [FILE] failed to append. java.lang.NullPointerException: Declaring class is null
at java.lang.NullPointerException: Declaring class is null
at at java.base/java.util.Objects.requireNonNull(Objects.java:233)
at at java.base/java.lang.StackTraceElement.<init>(StackTraceElement.java:162)
at at io.quarkiverse.logback.runtime.LoggingEventWrapper.getCallerData(LoggingEventWrapper.java:93)
at at ch.qos.logback.classic.pattern.ClassOfCallerConverter.getFullyQualifiedName(ClassOfCallerConverter.java:24)
at at ch.qos.logback.classic.pattern.NamedConverter.convert(NamedConverter.java:106)
at at ch.qos.logback.classic.pattern.NamedConverter.convert(NamedConverter.java:38)
at at ch.qos.logback.core.pattern.FormattingConverter.write(FormattingConverter.java:36)
at at ch.qos.logback.core.pattern.PatternLayoutBase.writeLoopOnConverters(PatternLayoutBase.java:116)
at at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:176)
at at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:39)
at at ch.qos.logback.core.encoder.LayoutWrappingEncoder.encode(LayoutWrappingEncoder.java:114)
at at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:192)
at at ch.qos.logback.core.FileAppender.writeOut(FileAppender.java:247)
at at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:237)
at at ch.qos.logback.core.rolling.RollingFileAppender.subAppend(RollingFileAppender.java:253)
at at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
at at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85)
at at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
at at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272)
at at ch.qos.logback.classic.Logger.callAppenders(Logger.java:259)
at at io.quarkiverse.logback.runtime.LogbackRecorder$3.doPublish(LogbackRecorder.java:155)
at at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:88)
at at org.jboss.logmanager.ExtHandler.publishToNestedHandlers(ExtHandler.java:122)
at at io.quarkus.bootstrap.logging.QuarkusDelayedHandler.activate(QuarkusDelayedHandler.java:292)
at at io.quarkus.bootstrap.logging.QuarkusDelayedHandler.setHandlers(QuarkusDelayedHandler.java:189)
at at io.quarkus.runtime.logging.LoggingSetupRecorder.initializeLogging(LoggingSetupRecorder.java:271)
at at io.quarkus.deployment.steps.LoggingResourceProcessor$setupLoggingRuntimeInit1899082837.deploy_0(Unknown Source)
at at io.quarkus.deployment.steps.LoggingResourceProcessor$setupLoggingRuntimeInit1899082837.deploy(Unknown Source)
at at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
at at io.quarkus.runtime.Application.start(Application.java:101)
at at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
at at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
Exception
this.declaringClass = Objects.requireNonNull(declaringClass, "Declaring class is null");
this.methodName = Objects.requireNonNull(methodName, "Method name is null");
/**
* Creates a stack trace element representing the specified execution
* point.
* ...
*
* @throws NullPointerException if {@code declaringClass} is {@code null}
* or {@code methodName} is {@code null}
*
* @since 9
*/
public StackTraceElement(String classLoaderName,
String moduleName, String moduleVersion,
String declaringClass, String methodName,
String fileName, int lineNumber) {
this.classLoaderName = classLoaderName;
this.moduleName = moduleName;
this.moduleVersion = moduleVersion;
this.declaringClass = Objects.requireNonNull(declaringClass, "Declaring class is null");
this.methodName = Objects.requireNonNull(methodName, "Method name is null");
this.fileName = fileName;
this.lineNumber = lineNumber;
}
...
Return null value
logRecord.getSourceClassName(),
logRecord.getSourceMethodName(),
...
@Override
public StackTraceElement[] getCallerData() {
if (callerData == null) {
callerData = new StackTraceElement[] {
new StackTraceElement(
null,
logRecord.getSourceModuleName(),
logRecord.getSourceModuleVersion(),
logRecord.getSourceClassName(),
logRecord.getSourceMethodName(),
logRecord.getSourceFileName(),
logRecord.getSourceLineNumber())
};
}
return callerData;
}
...
logRecord.getSourceClassName() == null ? "null" : logRecord.getSourceClassName(),
logRecord.getSourceMethodName() == null ? "null" : logRecord.getSourceMethodName(),
@Override
public StackTraceElement[] getCallerData() {
if (callerData == null) {
callerData = new StackTraceElement[] {
new StackTraceElement(
null,
logRecord.getSourceModuleName(),
logRecord.getSourceModuleVersion(),
logRecord.getSourceClassName() == null ? "null" : logRecord.getSourceClassName(),
logRecord.getSourceMethodName() == null ? "null" : logRecord.getSourceMethodName(),
logRecord.getSourceFileName(),
logRecord.getSourceLineNumber())
};
}
return callerData;
}
Using quarkus version:
implementation 'io.quarkiverse.logging.logback:quarkus-logging-logback:0.5.0'
quarkusPluginVersion=2.5.1.Final
quarkusPlatformVersion=2.5.1.Final
It causes an application startup error: LoggingLogbackProcessor#removeSlf4jBinding threw an exception: java.lang.NoSuchMethodError: io.quarkus.deployment.builditem.RemovedResourceBuildItem.
2021-12-06 10:30:45,561 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor#removeSlf4jBinding threw an exception: java.lang.NoSuchMethodError: io.quarkus.deployment.builditem.RemovedResourceBuildItem.<init>(Lio/quarkus/bootstrap/model/AppArtifactKey;Ljava/util/Set;)V
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.removeSlf4jBinding(LoggingLogbackProcessor.java:70)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:887)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:330)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:93)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:450)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:67)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:149)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:105)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:145)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:63)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor#removeSlf4jBinding threw an exception: java.lang.NoSuchMethodError: io.quarkus.deployment.builditem.RemovedResourceBuildItem.<init>(Lio/quarkus/bootstrap/model/AppArtifactKey;Ljava/util/Set;)V
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.removeSlf4jBinding(LoggingLogbackProcessor.java:70)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:887)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
at io.quarkus.builder.Execution.run(Execution.java:116)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:161)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:328)
... 9 more
Caused by: java.lang.NoSuchMethodError: io.quarkus.deployment.builditem.RemovedResourceBuildItem.<init>(Lio/quarkus/bootstrap/model/AppArtifactKey;Ljava/util/Set;)V
at io.quarkiverse.logging.logback.deployment.LoggingLogbackProcessor.removeSlf4jBinding(LoggingLogbackProcessor.java:70)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:887)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:834)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Issue while using custom appender in 0.12.0
<appender name="CONSOLE" class="net.logstash.logback.appender.LoggingEventAsyncDisruptorAppender">
<appender class="ch.qos.logback.core.ConsoleAppender">
<encoder class="c.a.ea.elf.logback.ELFLogbackEncoder">
<includeContext>false</includeContext>
<shortenedLoggerNameLength>20</shortenedLoggerNameLength>
<timestampPattern>[ISO_INSTANT]</timestampPattern>
<fieldNames>
<version>[ignore]</version>
<levelValue>[ignore]</levelValue>
<!--<timestamp>timestamp</timestamp>-->
<thread>[ignore]</thread>
</fieldNames>
</encoder>
</appender>
</appender>
Error
ERROR: Error running Quarkus
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:103)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ExceptionInInitializerError
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
at java.base/java.lang.Class.newInstance(Class.java:645)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:66)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
at c.t.p.p.Application.main(Application.java:52)
... 6 more
Caused by: java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.runner.ApplicationImpl.<clinit>(Unknown Source)
... 16 more
Caused by: java.lang.IncompatibleClassChangeError: class c.a.ea.elf.logback.ELFLogbackEncoder$$delayed cannot inherit from final class c.a.ea.elf.logback.ELFLogbackEncoder
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:480)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:440)
at ch.qos.logback.core.util.Loader.loadClass(Loader.java:120)
at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.begin(NestedComplexPropertyIA.java:102)
at ch.qos.logback.core.joran.spi.Interpreter.callBeginAction(Interpreter.java:269)
at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:145)
at ch.qos.logback.core.joran.spi.Interpreter.startElement(Interpreter.java:128)
at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:50)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
at io.quarkiverse.logback.runtime.LogbackRecorder.init(LogbackRecorder.java:91)
at io.quarkus.deployment.steps.LoggingLogbackProcessor$init519114389.deploy_4(Unknown Source)
at io.quarkus.deployment.steps.LoggingLogbackProcessor$init519114389.deploy(Unknown Source)
... 17 more
Hello,
Seems like the log level property set by the addon to Quarkus is incorrect. I receive the following app output:
(Quarkus Main Thread) WARN [io.quarkus.config] Unrecognized configuration key "quarkus.log.categories.\"com.some.package\".level" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo
This seems fair, since according to the Quarkus guide, property should not be quarkus.log.categories.<category-name>.level
, but quarkus.log.category."<category-name>".level
: https://quarkus.io/guides/logging
Also, the application doesn't seem to take into account the log levels set for certain specific classes, just takes the root level.
All the above was run in quarkus dev mode. Reproducer: https://github.com/peterhuba/quarkus-logback-issues
I have quarkus 2.1.1 and
<dependency>
<groupId>io.quarkiverse.logging.logback</groupId>
<artifactId>quarkus-logging-logback</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>commons-logging-jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
When I locally start Quarkus with my Application.jar from my IDE, it startups fine,
but when instead I try:
java -jar ./target/quarkus-app/quarkus-run.jar
LogManager error of type WRITE_FAILURE: The delayed handler's queue was overrun and log record(s) were lost. Did you forget to configure logging?
I assumed it could be related also to the environment specific application.properties set up I have -
In application.properties, I have added all config entries that are equal to all environments.
In application-dev.properties, I have added all config centries for the dev profile.
To ensure I am running on the dev profile, I had also added -Dquarkus.profile=dev, also I tried -DQUARKUS_PROFILE=dev, but the above error keeps re-appering. No idea why.
In a Quarkus test project, I've defined a logback.xml inside src/main/resources with this inclusion
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="logger.xml" />
</configuration>
logger.xml is a file inside an external dependency, that contains the loggers definition
<?xml version="1.0" encoding="UTF-8"?>
<included>
<conversionRule conversionWord="iso8601nano"
converterClass="com.dems98.test.log.converter.Iso8601NanoConverter" />
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%t] %-5level %logger{36} - %.-100000msg%n</pattern>
</encoder>
</appender>
<if condition='"${LOG_DESTINATION:-FILE}".equals("FILE")'>
<then>
<appender name="ROLLING_FILE_SPRING_BOOT"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/server/${NAME}.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/%d{yyyy-MM-dd_HH, UTC}.${NAME}.server-log.%i.zip</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>3</maxHistory>
<totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%t] %-5level %logger{36} - %.-100000msg%n</pattern>
</encoder>
</appender>
</then>
</if>
<if condition='"${LOG_DESTINATION:-FILE}".equals("CONSOLE")'>
<then>
<appender name="ROLLING_FILE_APP"
class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"timestamp": "%iso8601nano{UTC}",
"correlation-id": "%mdc{correlation-id}",
"message": "%.-100000msg%replace(%n%.-100000ex){'^\\s+$$',''}",
"level": "%level",
"version": "${VERSION}",
"class": "%logger",
"thread": "%t"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
</then>
<else>
<appender name="ROLLING_FILE_APP"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/${NAME}.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/%d{yyyy-MM-dd_HH, UTC}.${NAME}.log.%i.zip</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>3</maxHistory>
<totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"timestamp": "%iso8601nano{UTC}",
"correlation-id": "%mdc{correlation-id}",
"message": "%.-100000msg%replace(%n%.-100000ex){'^\\s+$$',''}",
"level": "%level",
"version": "${VERSION}",
"class": "%logger",
"thread": "%t"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
</else>
</if>
<logger name="com.test" level="${LOG_LEVEL:-INFO}" additivity="false">
<appender-ref ref="ROLLING_FILE_APP" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<if condition='"${LOG_DESTINATION:-FILE}".equals("FILE")'>
<then>
<appender-ref ref="ROLLING_FILE_SPRING_BOOT" />
</then>
</if>
</root>
</included>
This configuration gives me this warning
WARN in ch.qos.logback.core.joran.util.ConfigurationWatchListUtil@4b06f969 - Null ConfigurationWatchList. Cannot add jar:file:///C:/Users/dems98/.m2/repository/com/dems98/1.8/test.jar!/logger.xml
and logs are not produced.
But, if I remove the inclusion and move the logger.xml content inside logback.xml, everything works!
So I believe there's a bug with the xml inclusions.
Hello!
Really appreciating this plugin, makes migrating to Quarkus a lot easier for us in regards to log setup. I just noticed one thing however, which I can't see that it is my own fault. When enabling this plugin Quarkus startup errors seem to disapperar. Before adding the extension to our pom.xml, everything from Quarkus is logged as expected but after I just see nothing in the logs. Any idea what might be wrong?
Extension used:
<dependency>
<groupId>io.quarkiverse.logging.logback</groupId>
<artifactId>quarkus-logging-logback</artifactId>
<version>1.1.0</version>
</dependency>
Expected error in log:
2023-06-26 11:06:16,080 ERROR io.quarkus.runtime.Application - Failed to start application (with profile [dev]): ...
Hi!
Could you please provide some Quarkus app example where logback.xml is handled by application and Slf4j?
I have done all according documentation where I was supposed to include it dependency, but it's not working for me.
Hi, I am using quarkus-logging-logback 0.13.0.
To my knowledge, this is still the latest available version.
It requires me to add logback-core and logback-classic in verison 1.2.11 not to get errors in the project -
but these dependencies are totally outdated as well and give me warnings in my pom.
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>io.quarkiverse.logging.logback</groupId>
<artifactId>quarkus-logging-logback</artifactId>
<version>0.13.0</version>
</dependency>
Can you please update to the latest logback versions, @stuartwdouglas?
Thanks!
I started a discussion here : https://quarkusio.zulipchat.com/#narrow/stream/187030-users/topic/Quarkus.20-.20Logging.20Logback
here a sample : https://github.com/survivant/quarkus-logback it's not a complete working application but you should be able to see that it will create a KIND cluster and you should see debug logs (it's not the case right now)
I'm launching the junit from Intellij
Hello,
When:
quarkus build
java -jar target/quarkus-app/quarkus-run.jar -Dlogback.configurationFile=/some/dir/logback.xml
Then the logback file is not loaded, as would be expected according to the docs here: https://logback.qos.ch/manual/configuration.html#configFileProperty
Reproducer:
https://github.com/peterhuba/quarkus-logback-issues
Is there something wrong in the way the app is ran as described above, or something else?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.