FWIW, Looking at the Tomcat 9.0 code I see the same ServiceLoader code as in 
Tomcat 8.5, so the log4j-appserver code should still work.

Ralph

> On Feb 22, 2019, at 11:27 AM, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> 
> Tomcat’s class loader will be a parent of the web app class loader. That 
> means the log4j-related classes placed in the tomcat class loader won’t be 
> able to access anything in your web-app class loader. But your application 
> should have no problem accessing them in tomcat’s class loader provided you 
> don’t also have them in your web-app.  That said, I haven’t looked at Tomcat 
> 9 yet. It is possible that they have an additional class loader that is not 
> in the parent hierarchy of the web-app class loader. If that is the case your 
> web app wouldn’t be able to access it. But then again, it wouldn’t find Log4j 
> either.
> 
> What error do you get when you try to access the static fields?
> 
> Ralph
> 
>> On Feb 22, 2019, at 11:13 AM, Paul <pgbak...@gmail.com> wrote:
>> 
>> Hi Ralph,
>> 
>> See in between the lines.
>> 
>> Curious to hear what your take is on the classloader usage which is what is 
>> causing my issues.
>> 
>> Paul
>> 
>> On 22/02/2019 18:43, Ralph Goers wrote:
>>> I am not really clear on what you are trying to achieve so this answer is 
>>> making some guesses.
>>> 
>>> A typical tomcat deployment will have a boot class loader, the tomcat class 
>>> loader and each web app will have its own class loader.  Tomcat’s logging 
>>> has to happen using Tomcat’s class loader while the web app uses a 
>>> combination of Tomcat’s and the Web Apps.
>>> 
>>> It sounds like you want:
>>> To use Log4j for tomcat logging.
>>> To use Log4j for application logging.
>>> To incorporate your own appenders for application logging.
>> Correct
>>> 
>>> What I am not clear about is if you have any custom stuff you want to 
>>> include for Tomcat logging. I am going to assume you don’t.
>> Correct assumption, I don't need anything custom for Tomcat logging
>>> 
>>> There are a couple of ways I would try to make this work. First, you have 
>>> to remember that in Tomcat the WebApp class loader is searched first before 
>>> delegating to the Tomcat class loader and that any classes in the Tomcat 
>>> class loader won’t be able to directly access classes in the Web App class 
>>> loader. If you place Log4j and your custom appenders in the tomcat class 
>>> loader and do not include them in your web app then everything should work. 
>>> However, if your custom appenders have dependencies on a bunch of custom 
>>> code this can get pretty ugly as they would need to be in tomcat/lib as 
>>> well.
>> 
>> The custom appenders are standalone, they just have a public static field 
>> that is accessed by code in my webapp.
>> 
>> I tried doing as you described, but to no avail. It seems like the log4j 
>> stuff isn't loaded using the bootstrap/system or common classloader, but 
>> through the Java system classloader. What I don't understand is why the 
>> log4j stuff seems loaded by the Java system classloader and not the Tomcat 
>> classloaders... To my understanding: if any of the bootstrap/system or 
>> common classloaders of Tomcat would be used, all would be good, as those are 
>> all in the webapp classloader hierarchy, correct?
>> 
>>> 
>>> Another way to deal with this would be to place the log4j jars in both 
>>> tomcat/lib and in the web application’s WEB-INF/lib. Tomcat will initialize 
>>> using the Log4j jars it finds in tomcat/lib. The web app should use the 
>>> log4j jars from WEB-INF lib. In that case you will essentially have two 
>>> separate log4j implementations, which is pretty much what you have to do to 
>>> accomplish what it sounds like you want.
>> I haven't tried rolling two full log4j implementations, find that a bit of 
>> waist of resources (@runtime, but also deployment-wise: we'll have many 
>> containers running using this setup)
>>> 
>>> Also, by default Log4j uses the ClassLoaderContextSelector. This insures 
>>> that there are two LoggerContexts - one for tomcat and one for your web 
>>> app. If you place everything in tomcat/lib you probably don’t want to use 
>>> that ContextSelector. You probably would want to use the 
>>> BasicContextSelector for that.
>>> 
>>> Ralph
>>> 
>>>> On Feb 22, 2019, at 9:27 AM, Paul <pgbak...@gmail.com> wrote:
>>>> 
>>>> Tnx
>>>> 
>>>> I've also tried myself locally on my laptop (Wind10, Tomcat 9.0.16, log4j2 
>>>> 2.11.2, Java 1.8.0_162) but the exact same problem.
>>>> 
>>>> I've also looked at the docs on the Tomcat side: for Tomcat 9 the docs on 
>>>> logging don't mention this mechanism to use log4j anymore. On the 8.0 
>>>> documentation it is there, but talks about Log4j 1 and also details how 
>>>> you need to replace the tomcat-juli(-adapters).jars, which I think is not 
>>>> required anymore, see this case: 
>>>> https://bz.apache.org/bugzilla/show_bug.cgi?id=58588. However, that case 
>>>> seems to suggest that the way to replace tomcats internal logging is 
>>>> through JUL....
>>>> 
>>>> So, I gave JUL another shot:
>>>> 
>>>> - with all the log4j-core/api/jul/ and a log4j2.properties on the 
>>>> classpath set through  setenv.sh, I'm able to replace the internal logging 
>>>> of Tomcat using Log4j2. So far so good.
>>>> 
>>>> - For the logging from the single webaap/WAR I'll ever deploy in this 
>>>> tomcat instance, I have custom appenders that have static fields that are 
>>>> accessed from within the deployed webapp and through the log4j2 appender 
>>>> interface methods. Hence, log4j2 and the webapp need to use the same 
>>>> classloader (hierarchy), otherwise they'll be looking at teh same class 
>>>> loaded through different classloaders, thus different instances of the 
>>>> static field. I've got log4j2-web.jar and the jar containing my custom 
>>>> appenders both in the WEB-INF/lib folder of my webapp + a 
>>>> log4j2.properties in the WEB-INF folder, but then Log4J can't find the 
>>>> custom appenders. If I put the jar with the custom appenders on the 
>>>> classpath via Tomcat's setenv.sh, Log4J initializes properly, but the 
>>>> WebApp and Log4j seem to use 2 different classloaders, thus I run into the 
>>>> problem with multiple instances of the static field
>>>> 
>>>> Is there any setup I can use that works in this scenario?
>>>> 
>>>> Paul
>>>> 
>>>> On 20/02/2019 12:26, Apache wrote:
>>>>> Ok. I will try it myself with both of those and let you know, but it 
>>>>> might take a couple of days.
>>>>> 
>>>>> Ralph
>>>>> 
>>>>>> On Feb 19, 2019, at 11:58 PM, Paul <pgbak...@gmail.com> wrote:
>>>>>> 
>>>>>> With log4j-web on the classmate the INFO statements you mentioned
>>>>>> disappear, but the problem of internal tomcat logging via log4j isn't
>>>>>> solved.
>>>>>> 
>>>>>> And I've went through but those links many times, tried everything I 
>>>>>> could
>>>>>> find there, but no avail
>>>>>> 
>>>>>>> On Tue, Feb 19, 2019, 11:26 PM Remko Popma <remko.po...@gmail.com wrote:
>>>>>>> 
>>>>>>> Hi Paul,
>>>>>>> 
>>>>>>> Please try adding the log4j-web jar to the classpath:
>>>>>>>> INFO StatusLogger Log4j appears to be running in a Servlet environment,
>>>>>>> but there's no log4j-web module available. If you want better web 
>>>>>>> container
>>>>>>> support, please add the log4j-web JAR to your web archive or server lib
>>>>>>> directory.
>>>>>>> 
>>>>>>> Also, this user manual page may be useful:
>>>>>>> https://logging.apache.org/log4j/2.x/manual/webapp.html (and maybe this
>>>>>>> one: https://logging.apache.org/log4j/2.x/manual/logsep.html).
>>>>>>> 
>>>>>>> Remko.
>>>>>>> 
>>>>>>> (Shameless plug) Every java main() method deserves http://picocli.info
>>>>>>> 
>>>>>>>> On Feb 20, 2019, at 1:03, Paul <pgbak...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>> INFO StatusLogger Log4j appears to be running in a Servlet environment,
>>>>>>> but there's no log4j-web module available. If you want better web 
>>>>>>> container
>>>>>>> support, please add the log4j-web JAR to your web archive or server lib
>>>>>>> directory.
>>>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>>> 
>>>> ---
>>>> This email has been checked for viruses by AVG.
>>>> https://www.avg.com
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>> 
>>>> 
>>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org 
>> <mailto:log4j-user-unsubscr...@logging.apache.org>
>> For additional commands, e-mail: log4j-user-h...@logging.apache.org 
>> <mailto:log4j-user-h...@logging.apache.org>



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to