Setting logger levels not working when building with Bazel

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Setting logger levels not working when building with Bazel

Zellyn Hunter
Hi folks,

Please help me develop a mental model of what's going on with
LoggerContexts here.

I'm trying to get the following to work (log4j 2.12.1):

    org.apache.logging.log4j.Logger logz =
org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
    org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
    org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
Level.DEBUG);

However, the level is never getting set. If I watch instances of
LoggerContext in IntelliJ's debug, I can see that after the first
line, one named "579bb367" is created, but the second (and/or third)
line causes one to be created named "Default". Then, the logger logz
is never updated.

If I add a config file to my classpath named
log4j2.component.properties, with the value
Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
I can get it to work.

However, I would like to not have to do that everywhere, and would
very much like to understand why the ClassLoaderContextSelector is
failing. This code all lives inside LogGrabberTest, so I'm not
reaching across JAR/WAR/etc. boundaries or anything.

This code all worked in Pants, I think because it just smooshes all
the classes together into one Jar.

Thanks,

Zellyn

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Setting logger levels not working when building with Bazel

Zellyn Hunter
Perhaps to put it more succinctly, why are these loggers different?

    org.apache.logging.log4j.Logger logger1 =
org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
    org.apache.logging.log4j.Logger logger2 =
org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class.getName());

Here's what IntelliJ's debug pane says after these lines execute:
logger1 = {Logger@2317}
"com.squareup.logging.utils.LogGrabberTest:ERROR in 579bb367"
logger2 = {Logger@2318}
"com.squareup.logging.utils.LogGrabberTest:ERROR in Default"

I would like to stop this from happening, but more importantly
understand (a) what is going on, and (b) why the FAQ answer for
setting a log level programmatically gives me a solution that doesn't
work, because it's dealing with different LoggerContexts.

Thanks,

Zellyn


On Thu, Nov 14, 2019 at 12:45 PM Zellyn Hunter <[hidden email]> wrote:

>
> Hi folks,
>
> Please help me develop a mental model of what's going on with
> LoggerContexts here.
>
> I'm trying to get the following to work (log4j 2.12.1):
>
>     org.apache.logging.log4j.Logger logz =
> org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
>     org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
>     org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
> Level.DEBUG);
>
> However, the level is never getting set. If I watch instances of
> LoggerContext in IntelliJ's debug, I can see that after the first
> line, one named "579bb367" is created, but the second (and/or third)
> line causes one to be created named "Default". Then, the logger logz
> is never updated.
>
> If I add a config file to my classpath named
> log4j2.component.properties, with the value
> Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
> I can get it to work.
>
> However, I would like to not have to do that everywhere, and would
> very much like to understand why the ClassLoaderContextSelector is
> failing. This code all lives inside LogGrabberTest, so I'm not
> reaching across JAR/WAR/etc. boundaries or anything.
>
> This code all worked in Pants, I think because it just smooshes all
> the classes together into one Jar.
>
> Thanks,
>
> Zellyn

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Setting logger levels not working when building with Bazel

Zellyn Hunter
Further investigation and simplification:

I created a very simple test class:

package com.squareup.log4jtest;
public class Log4jTest {
  public static void main(String args[]) {
    org.apache.logging.log4j.Logger logger1 =
org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);
    org.apache.logging.log4j.Logger logger2 =
org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class.getName());
    System.out.println(logger1.toString());
    System.out.println(logger2.toString());
  }
}

I get the weird behavior when running with the maven/bazel api jar:

java -cp Log4jTest.jar:maven-log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
com.squareup.log4jtest.Log4jTest
ERROR StatusLogger No Log4j 2 configuration file found. Using default
configuration (logging only errors to the console), or user
programmatically provided configurations. Set system property
'log4j2.debug' to show Log4j 2 internal initialization logging. See
https://logging.apache.org/log4j/2.x/manual/configuration.html for
instructions on how to configure Log4j 2
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This
will impact performance.
com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
com.squareup.log4jtest.Log4jTest:ERROR in Default

But it's working fine when I use the log4j jar downloaded from the log4j site:

java -cp Log4jTest.jar:log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
com.squareup.log4jtest.Log4jTest
ERROR StatusLogger No Log4j 2 configuration file found. Using default
configuration (logging only errors to the console), or user
programmatically provided configurations. Set system property
'log4j2.debug' to show Log4j 2 internal initialization logging. See
https://logging.apache.org/log4j/2.x/manual/configuration.html for
instructions on how to configure Log4j 2
com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29


There's not much difference between the .jar file. Only the manifest,
and build-data.properties. Unzipping and diffing them, I get:

~/tmp diff -r apache/ maven/
diff -r apache/META-INF/MANIFEST.MF maven/META-INF/MANIFEST.MF
2,48c2,3
< Bundle-License: https://www.apache.org/licenses/LICENSE-2.0.txt
< Bundle-SymbolicName: org.apache.logging.log4j.api
< Built-By: rgoers
< Bnd-LastModified: 1565148668668
< Implementation-Vendor-Id: org.apache.logging.log4j
< Specification-Title: Apache Log4j API
< Log4jReleaseManager: Ralph Goers
< Bundle-DocURL: https://www.apache.org/
< Import-Package: org.apache.logging.log4j,org.apache.logging.log4j.mess
<  age,org.apache.logging.log4j.simple,org.apache.logging.log4j.spi,org.
<  apache.logging.log4j.status,org.apache.logging.log4j.util,org.osgi.fr
<  amework;version="[1.6,2)",org.osgi.framework.wiring;version="[1.0,2)"
<  ,sun.reflect;resolution:=optional
< Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
< Export-Package: org.apache.logging.log4j;uses:="org.apache.logging.log
<  4j.message,org.apache.logging.log4j.spi,org.apache.logging.log4j.util
<  ";version="2.12.1",org.apache.logging.log4j.message;uses:="org.apache
<  .logging.log4j.util";version="2.12.1",org.apache.logging.log4j.simple
<  ;uses:="org.apache.logging.log4j,org.apache.logging.log4j.message,org
<  .apache.logging.log4j.spi,org.apache.logging.log4j.util";version="2.1
<  2.1",org.apache.logging.log4j.spi;uses:="org.apache.logging.log4j,org
<  .apache.logging.log4j.message,org.apache.logging.log4j.util";version=
<  "2.12.1",org.apache.logging.log4j.status;uses:="org.apache.logging.lo
<  g4j,org.apache.logging.log4j.message,org.apache.logging.log4j.spi";ve
<  rsion="2.12.1",org.apache.logging.log4j.util;uses:="org.apache.loggin
<  g.log4j.message,org.apache.logging.log4j.spi,org.osgi.framework";vers
<  ion="2.12.1"
< Bundle-Name: Apache Log4j API
< Multi-Release: true
< Bundle-Activator: org.apache.logging.log4j.util.Activator
< Log4jReleaseVersion: 2.12.1
< Implementation-Title: Apache Log4j API
< Bundle-Description: The Apache Log4j API
< Implementation-Version: 2.12.1
< Specification-Vendor: The Apache Software Foundation
< Bundle-ManifestVersion: 2
< Bundle-Vendor: The Apache Software Foundation
< Tool: Bnd-3.5.0.201709291849
< Implementation-Vendor: The Apache Software Foundation
< Bundle-Version: 2.12.1
< X-Compile-Target-JDK: 1.7
< X-Compile-Source-JDK: 1.7
< Created-By: Apache Maven Bundle Plugin
< Build-Jdk: 1.8.0_144
< Specification-Version: 2.12.1
< Implementation-URL: https://logging.apache.org/log4j/2.x/log4j-api/
< Log4jReleaseKey: B3D8E1BA
---
> Created-By: singlejar
> Target-Label: @maven//:org_apache_logging_log4j_log4j_api
Only in maven/: build-data.properties
~/tmp cat maven/build-data.properties
build.target=bazel-out/darwin-fastbuild/bin/external/maven/v1/https/maven.global.square/artifactory/square-public/org/apache/logging/log4j/log4j-api/2.12.1/stamped_log4j-api-2.12.1.jar

On Thu, Nov 14, 2019 at 2:17 PM Zellyn Hunter <[hidden email]> wrote:

>
> Perhaps to put it more succinctly, why are these loggers different?
>
>     org.apache.logging.log4j.Logger logger1 =
> org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
>     org.apache.logging.log4j.Logger logger2 =
> org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class.getName());
>
> Here's what IntelliJ's debug pane says after these lines execute:
> logger1 = {Logger@2317}
> "com.squareup.logging.utils.LogGrabberTest:ERROR in 579bb367"
> logger2 = {Logger@2318}
> "com.squareup.logging.utils.LogGrabberTest:ERROR in Default"
>
> I would like to stop this from happening, but more importantly
> understand (a) what is going on, and (b) why the FAQ answer for
> setting a log level programmatically gives me a solution that doesn't
> work, because it's dealing with different LoggerContexts.
>
> Thanks,
>
> Zellyn
>
>
> On Thu, Nov 14, 2019 at 12:45 PM Zellyn Hunter <[hidden email]> wrote:
> >
> > Hi folks,
> >
> > Please help me develop a mental model of what's going on with
> > LoggerContexts here.
> >
> > I'm trying to get the following to work (log4j 2.12.1):
> >
> >     org.apache.logging.log4j.Logger logz =
> > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> >     org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
> >     org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
> > Level.DEBUG);
> >
> > However, the level is never getting set. If I watch instances of
> > LoggerContext in IntelliJ's debug, I can see that after the first
> > line, one named "579bb367" is created, but the second (and/or third)
> > line causes one to be created named "Default". Then, the logger logz
> > is never updated.
> >
> > If I add a config file to my classpath named
> > log4j2.component.properties, with the value
> > Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
> > I can get it to work.
> >
> > However, I would like to not have to do that everywhere, and would
> > very much like to understand why the ClassLoaderContextSelector is
> > failing. This code all lives inside LogGrabberTest, so I'm not
> > reaching across JAR/WAR/etc. boundaries or anything.
> >
> > This code all worked in Pants, I think because it just smooshes all
> > the classes together into one Jar.
> >
> > Thanks,
> >
> > Zellyn

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Setting logger levels not working when building with Bazel

Zellyn Hunter
After more experimentation, it appears that whatever plumbing we have
between maven/bazel/etc. was dropping "Multi-Release: true" from the
MANIFEST.MF file.

¯\_(ツ)_/¯

On Thu, Nov 14, 2019 at 4:02 PM Zellyn Hunter <[hidden email]> wrote:

>
> Further investigation and simplification:
>
> I created a very simple test class:
>
> package com.squareup.log4jtest;
> public class Log4jTest {
>   public static void main(String args[]) {
>     org.apache.logging.log4j.Logger logger1 =
> org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);
>     org.apache.logging.log4j.Logger logger2 =
> org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class.getName());
>     System.out.println(logger1.toString());
>     System.out.println(logger2.toString());
>   }
> }
>
> I get the weird behavior when running with the maven/bazel api jar:
>
> java -cp Log4jTest.jar:maven-log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> com.squareup.log4jtest.Log4jTest
> ERROR StatusLogger No Log4j 2 configuration file found. Using default
> configuration (logging only errors to the console), or user
> programmatically provided configurations. Set system property
> 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> https://logging.apache.org/log4j/2.x/manual/configuration.html for
> instructions on how to configure Log4j 2
> WARNING: sun.reflect.Reflection.getCallerClass is not supported. This
> will impact performance.
> com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> com.squareup.log4jtest.Log4jTest:ERROR in Default
>
> But it's working fine when I use the log4j jar downloaded from the log4j site:
>
> java -cp Log4jTest.jar:log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> com.squareup.log4jtest.Log4jTest
> ERROR StatusLogger No Log4j 2 configuration file found. Using default
> configuration (logging only errors to the console), or user
> programmatically provided configurations. Set system property
> 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> https://logging.apache.org/log4j/2.x/manual/configuration.html for
> instructions on how to configure Log4j 2
> com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
>
>
> There's not much difference between the .jar file. Only the manifest,
> and build-data.properties. Unzipping and diffing them, I get:
>
> ~/tmp diff -r apache/ maven/
> diff -r apache/META-INF/MANIFEST.MF maven/META-INF/MANIFEST.MF
> 2,48c2,3
> < Bundle-License: https://www.apache.org/licenses/LICENSE-2.0.txt
> < Bundle-SymbolicName: org.apache.logging.log4j.api
> < Built-By: rgoers
> < Bnd-LastModified: 1565148668668
> < Implementation-Vendor-Id: org.apache.logging.log4j
> < Specification-Title: Apache Log4j API
> < Log4jReleaseManager: Ralph Goers
> < Bundle-DocURL: https://www.apache.org/
> < Import-Package: org.apache.logging.log4j,org.apache.logging.log4j.mess
> <  age,org.apache.logging.log4j.simple,org.apache.logging.log4j.spi,org.
> <  apache.logging.log4j.status,org.apache.logging.log4j.util,org.osgi.fr
> <  amework;version="[1.6,2)",org.osgi.framework.wiring;version="[1.0,2)"
> <  ,sun.reflect;resolution:=optional
> < Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
> < Export-Package: org.apache.logging.log4j;uses:="org.apache.logging.log
> <  4j.message,org.apache.logging.log4j.spi,org.apache.logging.log4j.util
> <  ";version="2.12.1",org.apache.logging.log4j.message;uses:="org.apache
> <  .logging.log4j.util";version="2.12.1",org.apache.logging.log4j.simple
> <  ;uses:="org.apache.logging.log4j,org.apache.logging.log4j.message,org
> <  .apache.logging.log4j.spi,org.apache.logging.log4j.util";version="2.1
> <  2.1",org.apache.logging.log4j.spi;uses:="org.apache.logging.log4j,org
> <  .apache.logging.log4j.message,org.apache.logging.log4j.util";version=
> <  "2.12.1",org.apache.logging.log4j.status;uses:="org.apache.logging.lo
> <  g4j,org.apache.logging.log4j.message,org.apache.logging.log4j.spi";ve
> <  rsion="2.12.1",org.apache.logging.log4j.util;uses:="org.apache.loggin
> <  g.log4j.message,org.apache.logging.log4j.spi,org.osgi.framework";vers
> <  ion="2.12.1"
> < Bundle-Name: Apache Log4j API
> < Multi-Release: true
> < Bundle-Activator: org.apache.logging.log4j.util.Activator
> < Log4jReleaseVersion: 2.12.1
> < Implementation-Title: Apache Log4j API
> < Bundle-Description: The Apache Log4j API
> < Implementation-Version: 2.12.1
> < Specification-Vendor: The Apache Software Foundation
> < Bundle-ManifestVersion: 2
> < Bundle-Vendor: The Apache Software Foundation
> < Tool: Bnd-3.5.0.201709291849
> < Implementation-Vendor: The Apache Software Foundation
> < Bundle-Version: 2.12.1
> < X-Compile-Target-JDK: 1.7
> < X-Compile-Source-JDK: 1.7
> < Created-By: Apache Maven Bundle Plugin
> < Build-Jdk: 1.8.0_144
> < Specification-Version: 2.12.1
> < Implementation-URL: https://logging.apache.org/log4j/2.x/log4j-api/
> < Log4jReleaseKey: B3D8E1BA
> ---
> > Created-By: singlejar
> > Target-Label: @maven//:org_apache_logging_log4j_log4j_api
> Only in maven/: build-data.properties
> ~/tmp cat maven/build-data.properties
> build.target=bazel-out/darwin-fastbuild/bin/external/maven/v1/https/maven.global.square/artifactory/square-public/org/apache/logging/log4j/log4j-api/2.12.1/stamped_log4j-api-2.12.1.jar
>
> On Thu, Nov 14, 2019 at 2:17 PM Zellyn Hunter <[hidden email]> wrote:
> >
> > Perhaps to put it more succinctly, why are these loggers different?
> >
> >     org.apache.logging.log4j.Logger logger1 =
> > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> >     org.apache.logging.log4j.Logger logger2 =
> > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class.getName());
> >
> > Here's what IntelliJ's debug pane says after these lines execute:
> > logger1 = {Logger@2317}
> > "com.squareup.logging.utils.LogGrabberTest:ERROR in 579bb367"
> > logger2 = {Logger@2318}
> > "com.squareup.logging.utils.LogGrabberTest:ERROR in Default"
> >
> > I would like to stop this from happening, but more importantly
> > understand (a) what is going on, and (b) why the FAQ answer for
> > setting a log level programmatically gives me a solution that doesn't
> > work, because it's dealing with different LoggerContexts.
> >
> > Thanks,
> >
> > Zellyn
> >
> >
> > On Thu, Nov 14, 2019 at 12:45 PM Zellyn Hunter <[hidden email]> wrote:
> > >
> > > Hi folks,
> > >
> > > Please help me develop a mental model of what's going on with
> > > LoggerContexts here.
> > >
> > > I'm trying to get the following to work (log4j 2.12.1):
> > >
> > >     org.apache.logging.log4j.Logger logz =
> > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> > >     org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
> > >     org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
> > > Level.DEBUG);
> > >
> > > However, the level is never getting set. If I watch instances of
> > > LoggerContext in IntelliJ's debug, I can see that after the first
> > > line, one named "579bb367" is created, but the second (and/or third)
> > > line causes one to be created named "Default". Then, the logger logz
> > > is never updated.
> > >
> > > If I add a config file to my classpath named
> > > log4j2.component.properties, with the value
> > > Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
> > > I can get it to work.
> > >
> > > However, I would like to not have to do that everywhere, and would
> > > very much like to understand why the ClassLoaderContextSelector is
> > > failing. This code all lives inside LogGrabberTest, so I'm not
> > > reaching across JAR/WAR/etc. boundaries or anything.
> > >
> > > This code all worked in Pants, I think because it just smooshes all
> > > the classes together into one Jar.
> > >
> > > Thanks,
> > >
> > > Zellyn

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Setting logger levels not working when building with Bazel

Matt Sicker
You still raise an interesting question about the LoggerContext thing.
I've never really understood the "current context" boolean argument
and whether or not that ever works properly. I think in theory, the
current context is supposed to cache whatever the last seen
LoggerContext in that thread is which wouldn't work properly in, say,
a shared thread pool with multiple LoggerContexts active.

On Thu, 14 Nov 2019 at 15:34, Zellyn Hunter <[hidden email]> wrote:

>
> After more experimentation, it appears that whatever plumbing we have
> between maven/bazel/etc. was dropping "Multi-Release: true" from the
> MANIFEST.MF file.
>
> ¯\_(ツ)_/¯
>
> On Thu, Nov 14, 2019 at 4:02 PM Zellyn Hunter <[hidden email]> wrote:
> >
> > Further investigation and simplification:
> >
> > I created a very simple test class:
> >
> > package com.squareup.log4jtest;
> > public class Log4jTest {
> >   public static void main(String args[]) {
> >     org.apache.logging.log4j.Logger logger1 =
> > org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);
> >     org.apache.logging.log4j.Logger logger2 =
> > org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class.getName());
> >     System.out.println(logger1.toString());
> >     System.out.println(logger2.toString());
> >   }
> > }
> >
> > I get the weird behavior when running with the maven/bazel api jar:
> >
> > java -cp Log4jTest.jar:maven-log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> > com.squareup.log4jtest.Log4jTest
> > ERROR StatusLogger No Log4j 2 configuration file found. Using default
> > configuration (logging only errors to the console), or user
> > programmatically provided configurations. Set system property
> > 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> > https://logging.apache.org/log4j/2.x/manual/configuration.html for
> > instructions on how to configure Log4j 2
> > WARNING: sun.reflect.Reflection.getCallerClass is not supported. This
> > will impact performance.
> > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> > com.squareup.log4jtest.Log4jTest:ERROR in Default
> >
> > But it's working fine when I use the log4j jar downloaded from the log4j site:
> >
> > java -cp Log4jTest.jar:log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> > com.squareup.log4jtest.Log4jTest
> > ERROR StatusLogger No Log4j 2 configuration file found. Using default
> > configuration (logging only errors to the console), or user
> > programmatically provided configurations. Set system property
> > 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> > https://logging.apache.org/log4j/2.x/manual/configuration.html for
> > instructions on how to configure Log4j 2
> > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> >
> >
> > There's not much difference between the .jar file. Only the manifest,
> > and build-data.properties. Unzipping and diffing them, I get:
> >
> > ~/tmp diff -r apache/ maven/
> > diff -r apache/META-INF/MANIFEST.MF maven/META-INF/MANIFEST.MF
> > 2,48c2,3
> > < Bundle-License: https://www.apache.org/licenses/LICENSE-2.0.txt
> > < Bundle-SymbolicName: org.apache.logging.log4j.api
> > < Built-By: rgoers
> > < Bnd-LastModified: 1565148668668
> > < Implementation-Vendor-Id: org.apache.logging.log4j
> > < Specification-Title: Apache Log4j API
> > < Log4jReleaseManager: Ralph Goers
> > < Bundle-DocURL: https://www.apache.org/
> > < Import-Package: org.apache.logging.log4j,org.apache.logging.log4j.mess
> > <  age,org.apache.logging.log4j.simple,org.apache.logging.log4j.spi,org.
> > <  apache.logging.log4j.status,org.apache.logging.log4j.util,org.osgi.fr
> > <  amework;version="[1.6,2)",org.osgi.framework.wiring;version="[1.0,2)"
> > <  ,sun.reflect;resolution:=optional
> > < Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
> > < Export-Package: org.apache.logging.log4j;uses:="org.apache.logging.log
> > <  4j.message,org.apache.logging.log4j.spi,org.apache.logging.log4j.util
> > <  ";version="2.12.1",org.apache.logging.log4j.message;uses:="org.apache
> > <  .logging.log4j.util";version="2.12.1",org.apache.logging.log4j.simple
> > <  ;uses:="org.apache.logging.log4j,org.apache.logging.log4j.message,org
> > <  .apache.logging.log4j.spi,org.apache.logging.log4j.util";version="2.1
> > <  2.1",org.apache.logging.log4j.spi;uses:="org.apache.logging.log4j,org
> > <  .apache.logging.log4j.message,org.apache.logging.log4j.util";version=
> > <  "2.12.1",org.apache.logging.log4j.status;uses:="org.apache.logging.lo
> > <  g4j,org.apache.logging.log4j.message,org.apache.logging.log4j.spi";ve
> > <  rsion="2.12.1",org.apache.logging.log4j.util;uses:="org.apache.loggin
> > <  g.log4j.message,org.apache.logging.log4j.spi,org.osgi.framework";vers
> > <  ion="2.12.1"
> > < Bundle-Name: Apache Log4j API
> > < Multi-Release: true
> > < Bundle-Activator: org.apache.logging.log4j.util.Activator
> > < Log4jReleaseVersion: 2.12.1
> > < Implementation-Title: Apache Log4j API
> > < Bundle-Description: The Apache Log4j API
> > < Implementation-Version: 2.12.1
> > < Specification-Vendor: The Apache Software Foundation
> > < Bundle-ManifestVersion: 2
> > < Bundle-Vendor: The Apache Software Foundation
> > < Tool: Bnd-3.5.0.201709291849
> > < Implementation-Vendor: The Apache Software Foundation
> > < Bundle-Version: 2.12.1
> > < X-Compile-Target-JDK: 1.7
> > < X-Compile-Source-JDK: 1.7
> > < Created-By: Apache Maven Bundle Plugin
> > < Build-Jdk: 1.8.0_144
> > < Specification-Version: 2.12.1
> > < Implementation-URL: https://logging.apache.org/log4j/2.x/log4j-api/
> > < Log4jReleaseKey: B3D8E1BA
> > ---
> > > Created-By: singlejar
> > > Target-Label: @maven//:org_apache_logging_log4j_log4j_api
> > Only in maven/: build-data.properties
> > ~/tmp cat maven/build-data.properties
> > build.target=bazel-out/darwin-fastbuild/bin/external/maven/v1/https/maven.global.square/artifactory/square-public/org/apache/logging/log4j/log4j-api/2.12.1/stamped_log4j-api-2.12.1.jar
> >
> > On Thu, Nov 14, 2019 at 2:17 PM Zellyn Hunter <[hidden email]> wrote:
> > >
> > > Perhaps to put it more succinctly, why are these loggers different?
> > >
> > >     org.apache.logging.log4j.Logger logger1 =
> > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> > >     org.apache.logging.log4j.Logger logger2 =
> > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class.getName());
> > >
> > > Here's what IntelliJ's debug pane says after these lines execute:
> > > logger1 = {Logger@2317}
> > > "com.squareup.logging.utils.LogGrabberTest:ERROR in 579bb367"
> > > logger2 = {Logger@2318}
> > > "com.squareup.logging.utils.LogGrabberTest:ERROR in Default"
> > >
> > > I would like to stop this from happening, but more importantly
> > > understand (a) what is going on, and (b) why the FAQ answer for
> > > setting a log level programmatically gives me a solution that doesn't
> > > work, because it's dealing with different LoggerContexts.
> > >
> > > Thanks,
> > >
> > > Zellyn
> > >
> > >
> > > On Thu, Nov 14, 2019 at 12:45 PM Zellyn Hunter <[hidden email]> wrote:
> > > >
> > > > Hi folks,
> > > >
> > > > Please help me develop a mental model of what's going on with
> > > > LoggerContexts here.
> > > >
> > > > I'm trying to get the following to work (log4j 2.12.1):
> > > >
> > > >     org.apache.logging.log4j.Logger logz =
> > > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> > > >     org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
> > > >     org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
> > > > Level.DEBUG);
> > > >
> > > > However, the level is never getting set. If I watch instances of
> > > > LoggerContext in IntelliJ's debug, I can see that after the first
> > > > line, one named "579bb367" is created, but the second (and/or third)
> > > > line causes one to be created named "Default". Then, the logger logz
> > > > is never updated.
> > > >
> > > > If I add a config file to my classpath named
> > > > log4j2.component.properties, with the value
> > > > Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
> > > > I can get it to work.
> > > >
> > > > However, I would like to not have to do that everywhere, and would
> > > > very much like to understand why the ClassLoaderContextSelector is
> > > > failing. This code all lives inside LogGrabberTest, so I'm not
> > > > reaching across JAR/WAR/etc. boundaries or anything.
> > > >
> > > > This code all worked in Pants, I think because it just smooshes all
> > > > the classes together into one Jar.
> > > >
> > > > Thanks,
> > > >
> > > > Zellyn
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>


--
Matt Sicker <[hidden email]>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Setting logger levels not working when building with Bazel

Zellyn Hunter
Yeah, I think so. But unfortunately, none of the recommended ways of
programmatically setting a logger's level include replicating the
context-finding code path that would have been used to get the logger
initially, if you used the class rather than the name.

Zellyn

On Fri, Nov 15, 2019 at 10:27 AM Matt Sicker <[hidden email]> wrote:

>
> You still raise an interesting question about the LoggerContext thing.
> I've never really understood the "current context" boolean argument
> and whether or not that ever works properly. I think in theory, the
> current context is supposed to cache whatever the last seen
> LoggerContext in that thread is which wouldn't work properly in, say,
> a shared thread pool with multiple LoggerContexts active.
>
> On Thu, 14 Nov 2019 at 15:34, Zellyn Hunter <[hidden email]> wrote:
> >
> > After more experimentation, it appears that whatever plumbing we have
> > between maven/bazel/etc. was dropping "Multi-Release: true" from the
> > MANIFEST.MF file.
> >
> > ¯\_(ツ)_/¯
> >
> > On Thu, Nov 14, 2019 at 4:02 PM Zellyn Hunter <[hidden email]> wrote:
> > >
> > > Further investigation and simplification:
> > >
> > > I created a very simple test class:
> > >
> > > package com.squareup.log4jtest;
> > > public class Log4jTest {
> > >   public static void main(String args[]) {
> > >     org.apache.logging.log4j.Logger logger1 =
> > > org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);
> > >     org.apache.logging.log4j.Logger logger2 =
> > > org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class.getName());
> > >     System.out.println(logger1.toString());
> > >     System.out.println(logger2.toString());
> > >   }
> > > }
> > >
> > > I get the weird behavior when running with the maven/bazel api jar:
> > >
> > > java -cp Log4jTest.jar:maven-log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> > > com.squareup.log4jtest.Log4jTest
> > > ERROR StatusLogger No Log4j 2 configuration file found. Using default
> > > configuration (logging only errors to the console), or user
> > > programmatically provided configurations. Set system property
> > > 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> > > https://logging.apache.org/log4j/2.x/manual/configuration.html for
> > > instructions on how to configure Log4j 2
> > > WARNING: sun.reflect.Reflection.getCallerClass is not supported. This
> > > will impact performance.
> > > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> > > com.squareup.log4jtest.Log4jTest:ERROR in Default
> > >
> > > But it's working fine when I use the log4j jar downloaded from the log4j site:
> > >
> > > java -cp Log4jTest.jar:log4j-api-2.12.1.jar:log4j-core-2.12.1.jar
> > > com.squareup.log4jtest.Log4jTest
> > > ERROR StatusLogger No Log4j 2 configuration file found. Using default
> > > configuration (logging only errors to the console), or user
> > > programmatically provided configurations. Set system property
> > > 'log4j2.debug' to show Log4j 2 internal initialization logging. See
> > > https://logging.apache.org/log4j/2.x/manual/configuration.html for
> > > instructions on how to configure Log4j 2
> > > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> > > com.squareup.log4jtest.Log4jTest:ERROR in 799f7e29
> > >
> > >
> > > There's not much difference between the .jar file. Only the manifest,
> > > and build-data.properties. Unzipping and diffing them, I get:
> > >
> > > ~/tmp diff -r apache/ maven/
> > > diff -r apache/META-INF/MANIFEST.MF maven/META-INF/MANIFEST.MF
> > > 2,48c2,3
> > > < Bundle-License: https://www.apache.org/licenses/LICENSE-2.0.txt
> > > < Bundle-SymbolicName: org.apache.logging.log4j.api
> > > < Built-By: rgoers
> > > < Bnd-LastModified: 1565148668668
> > > < Implementation-Vendor-Id: org.apache.logging.log4j
> > > < Specification-Title: Apache Log4j API
> > > < Log4jReleaseManager: Ralph Goers
> > > < Bundle-DocURL: https://www.apache.org/
> > > < Import-Package: org.apache.logging.log4j,org.apache.logging.log4j.mess
> > > <  age,org.apache.logging.log4j.simple,org.apache.logging.log4j.spi,org.
> > > <  apache.logging.log4j.status,org.apache.logging.log4j.util,org.osgi.fr
> > > <  amework;version="[1.6,2)",org.osgi.framework.wiring;version="[1.0,2)"
> > > <  ,sun.reflect;resolution:=optional
> > > < Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
> > > < Export-Package: org.apache.logging.log4j;uses:="org.apache.logging.log
> > > <  4j.message,org.apache.logging.log4j.spi,org.apache.logging.log4j.util
> > > <  ";version="2.12.1",org.apache.logging.log4j.message;uses:="org.apache
> > > <  .logging.log4j.util";version="2.12.1",org.apache.logging.log4j.simple
> > > <  ;uses:="org.apache.logging.log4j,org.apache.logging.log4j.message,org
> > > <  .apache.logging.log4j.spi,org.apache.logging.log4j.util";version="2.1
> > > <  2.1",org.apache.logging.log4j.spi;uses:="org.apache.logging.log4j,org
> > > <  .apache.logging.log4j.message,org.apache.logging.log4j.util";version=
> > > <  "2.12.1",org.apache.logging.log4j.status;uses:="org.apache.logging.lo
> > > <  g4j,org.apache.logging.log4j.message,org.apache.logging.log4j.spi";ve
> > > <  rsion="2.12.1",org.apache.logging.log4j.util;uses:="org.apache.loggin
> > > <  g.log4j.message,org.apache.logging.log4j.spi,org.osgi.framework";vers
> > > <  ion="2.12.1"
> > > < Bundle-Name: Apache Log4j API
> > > < Multi-Release: true
> > > < Bundle-Activator: org.apache.logging.log4j.util.Activator
> > > < Log4jReleaseVersion: 2.12.1
> > > < Implementation-Title: Apache Log4j API
> > > < Bundle-Description: The Apache Log4j API
> > > < Implementation-Version: 2.12.1
> > > < Specification-Vendor: The Apache Software Foundation
> > > < Bundle-ManifestVersion: 2
> > > < Bundle-Vendor: The Apache Software Foundation
> > > < Tool: Bnd-3.5.0.201709291849
> > > < Implementation-Vendor: The Apache Software Foundation
> > > < Bundle-Version: 2.12.1
> > > < X-Compile-Target-JDK: 1.7
> > > < X-Compile-Source-JDK: 1.7
> > > < Created-By: Apache Maven Bundle Plugin
> > > < Build-Jdk: 1.8.0_144
> > > < Specification-Version: 2.12.1
> > > < Implementation-URL: https://logging.apache.org/log4j/2.x/log4j-api/
> > > < Log4jReleaseKey: B3D8E1BA
> > > ---
> > > > Created-By: singlejar
> > > > Target-Label: @maven//:org_apache_logging_log4j_log4j_api
> > > Only in maven/: build-data.properties
> > > ~/tmp cat maven/build-data.properties
> > > build.target=bazel-out/darwin-fastbuild/bin/external/maven/v1/https/maven.global.square/artifactory/square-public/org/apache/logging/log4j/log4j-api/2.12.1/stamped_log4j-api-2.12.1.jar
> > >
> > > On Thu, Nov 14, 2019 at 2:17 PM Zellyn Hunter <[hidden email]> wrote:
> > > >
> > > > Perhaps to put it more succinctly, why are these loggers different?
> > > >
> > > >     org.apache.logging.log4j.Logger logger1 =
> > > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> > > >     org.apache.logging.log4j.Logger logger2 =
> > > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class.getName());
> > > >
> > > > Here's what IntelliJ's debug pane says after these lines execute:
> > > > logger1 = {Logger@2317}
> > > > "com.squareup.logging.utils.LogGrabberTest:ERROR in 579bb367"
> > > > logger2 = {Logger@2318}
> > > > "com.squareup.logging.utils.LogGrabberTest:ERROR in Default"
> > > >
> > > > I would like to stop this from happening, but more importantly
> > > > understand (a) what is going on, and (b) why the FAQ answer for
> > > > setting a log level programmatically gives me a solution that doesn't
> > > > work, because it's dealing with different LoggerContexts.
> > > >
> > > > Thanks,
> > > >
> > > > Zellyn
> > > >
> > > >
> > > > On Thu, Nov 14, 2019 at 12:45 PM Zellyn Hunter <[hidden email]> wrote:
> > > > >
> > > > > Hi folks,
> > > > >
> > > > > Please help me develop a mental model of what's going on with
> > > > > LoggerContexts here.
> > > > >
> > > > > I'm trying to get the following to work (log4j 2.12.1):
> > > > >
> > > > >     org.apache.logging.log4j.Logger logz =
> > > > > org.apache.logging.log4j.LogManager.getLogger(LogGrabberTest.class);
> > > > >     org.apache.logging.log4j.LogManager.getContext(false);  // just for testing
> > > > >     org.apache.logging.log4j.core.config.Configurator.setLevel(LogGrabberTest.class.getName(),
> > > > > Level.DEBUG);
> > > > >
> > > > > However, the level is never getting set. If I watch instances of
> > > > > LoggerContext in IntelliJ's debug, I can see that after the first
> > > > > line, one named "579bb367" is created, but the second (and/or third)
> > > > > line causes one to be created named "Default". Then, the logger logz
> > > > > is never updated.
> > > > >
> > > > > If I add a config file to my classpath named
> > > > > log4j2.component.properties, with the value
> > > > > Log4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector,
> > > > > I can get it to work.
> > > > >
> > > > > However, I would like to not have to do that everywhere, and would
> > > > > very much like to understand why the ClassLoaderContextSelector is
> > > > > failing. This code all lives inside LogGrabberTest, so I'm not
> > > > > reaching across JAR/WAR/etc. boundaries or anything.
> > > > >
> > > > > This code all worked in Pants, I think because it just smooshes all
> > > > > the classes together into one Jar.
> > > > >
> > > > > Thanks,
> > > > >
> > > > > Zellyn
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
>
>
> --
> Matt Sicker <[hidden email]>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]