Thanks that did the trick.

Really appreciate the super fast support.

Cheers
Adam

From: logback-user <logback-user-boun...@qos.ch> On Behalf Of Raymond Augé
Sent: Tuesday, 17 May 2022 2:28 pm
To: logback users list <logback-user@qos.ch>
Subject: [EXTERNAL]: Re: [logback-user] Issues with logback and maven/shading.

CAUTION: This email originated from outside of the organization. Do not click 
links or open attachments unless you recognize the sender and know the content 
is safe.


________________________________
Did you notice that the config file still references the unshaded 
ch.qos.logback.core.rolling.FixedWindowRollingPolicy class (among others)?

Anywhere logback loads classes dynamically by string literal will have to be 
modified to use the shaded package names. ServiceLoader descriptors, etc.

HTH

On Mon., May 16, 2022, 6:08 p.m. Adam Somerville, 
<adam.somervi...@lyniate.com<mailto:adam.somervi...@lyniate.com>> wrote:
Hi

I work for Lyniate and I am trying to use logback in one of our products. For 
the most part things are great, expect for one niche issue I have been stuck on 
for days. It’s a little complex:

Overall, I am building a jar that people can incorporate into their own 
applications.  It is built with maven, when I include logback a dependency it 
works. However, when I try to shade logback in the jar it seems to ignore my 
configuration properties files. i.e. I cannot see any log file when I run.

This only occurs in the built jar, I cannot reproduce in a dev environment at 
all, and as mentioned it only ignores config when shading logback. Here are the 
relevant code snippets:
              final URL url = ClassLoader.getSystemResource(config);
     if (url == null) {
       throw new IOException("Unable to find logback configuration file '" + 
config + "' on the classpath.");
     }

     System.out.print("URL found: " + url.toExternalForm());

     try {
       this.filepath = Paths.get(url.toURI()).toAbsolutePath();
       this.filename = filepath.getFileName().toString();
       this.factory = loadConfig(filepath);

     ....
     (init watch service)
     …
     } catch (Exception e) {
       e.printStackTrace(System.err);
       throw new IOException("Failed to configure logback using configuration 
file '" + this.filepath  + "'.", e);
     }
  and

  private static ILoggerFactory loadConfig(final Path config) throws 
IOException {
     try {
       final JoranConfigurator configurator = new JoranConfigurator();
       //final LoggerContext context = (LoggerContext) 
LoggerFactory.getILoggerFactory();
       final LoggerContext context = new LoggerContext();
       dumpDebugInformation(context);

       configurator.setContext(context);
       context.reset();
       configurator.doConfigure(config.toFile());

       final LevelChangePropagator levelChangePropagator = new 
LevelChangePropagator();
       levelChangePropagator.setContext(context);
       context.addListener(levelChangePropagator);

       return context;

     } catch (final JoranException e) {
       throw new IOException("An error occured configuring the RMT logger with 
file", e);//TODO Better error message
     }
  }


FYI am also initialising a java watch service in the constructor where the 
first snippet is called, not shown above thought I better mention in case it is 
relevant.

When the code executes  I get the correct output for all the paths and what 
looks to be the right object. However, it does not produce my log file.

this.filepath: <correct path>\libs\RMTLogging.xml
this.factory (name): ch.qos.logback.classic.LoggerContext.

This is the same as output as when it is working. It seems like it is not 
binding to SLF4J correctly.

I have tried both:

                    final LoggerContext context = (LoggerContext) 
LoggerFactory.getILoggerFactory();

and

                    final LoggerContext context = new LoggerContext();

I suspected the shading is somehow interfering with binding to SLF4J but 
instantiating the LoggerContext directly does not seem to make a difference. 
There are no errors or exceptions. Just no log file when I try and shade 
logback into my final built jar. Which means even though it has the correct 
config file path and appears load it,   seems it is not really being configured.

Below are my settings file. It works in dev environment and a non-shaded jar. 
When it is shaded with the same config it just does not work.

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="Main"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
     <!--See also 
http://logback.qos.ch/manual/appenders.html#RollingFileAppender<http://logback.qos.ch/manual/appenders.html#RollingFileAppender>
 -->
     <File>Result.log</File>
     <encoder>
       <!--Old Symphonia pattern <pattern>%-5p %c{2} %x: %m%n</pattern> -->
       <pattern>%d{DATE} [%-5p] {%t} \(%c\) %m%n</pattern>
     </encoder>
     <rollingPolicy
       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
       <maxIndex>9</maxIndex>
       <FileNamePattern>Result.log.%i</FileNamePattern>
     </rollingPolicy>
     <triggeringPolicy
       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
       <MaxFileSize>5MB</MaxFileSize>
     </triggeringPolicy>
  </appender>
  <logger name="com.orion.symphonia3.MessageFactory" level="ERROR">
     <appender-ref ref="Main" />
  </logger>
  <logger name="com.orion.symphonia3.RhapsodyLicenseCheck" level="DEBUG">
     <appender-ref ref="Main" />
  </logger>
  <logger name="com.orion.symphonia3.MessageWarehouseDefn" level="DEBUG">
     <appender-ref ref="Main" />
  </logger>
  <logger name="load.Message" level="DEBUG">
     <appender-ref ref="Main" />
  </logger>
(Etc many more loggers)


The shading is fairly critical for us. There are several other shaded third 
party jars, with no issues. It just seems to be just the configuration part of 
logback that causes these issue.
 Any ideas as to what is happening? If you need more information, please let me 
know.
 Kind Regards
Adam



_______________________________________________
logback-user mailing list
logback-user@qos.ch<mailto:logback-user@qos.ch>
http://mailman.qos.ch/mailman/listinfo/logback-user<http://mailman.qos.ch/mailman/listinfo/logback-user>

Disclaimer

The information contained in this communication from the sender is 
confidential. It is intended solely for use by the recipient and others 
authorized to receive it. If you are not the recipient, you are hereby notified 
that any disclosure, copying, distribution or taking action in relation of the 
contents of this information is strictly prohibited and may be unlawful.

This email has been scanned for viruses and malware, and may have been 
automatically archived by Mimecast Ltd, an innovator in Software as a Service 
(SaaS) for business. Providing a safer and more useful place for your human 
generated data. Specializing in; Security, archiving and compliance. To find 
out more visit the Mimecast website.
_______________________________________________
logback-user mailing list
logback-user@qos.ch
http://mailman.qos.ch/mailman/listinfo/logback-user

Reply via email to