logging-log4j-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ralph Goers <ralph.go...@dslextreme.com>
Subject Re: How to have a separate log file for a thread and all sub threads?
Date Wed, 24 Apr 2019 18:27:38 GMT
The relevant section is - https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#Thread-java.lang.ThreadGroup-java.lang.Runnable-
<https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#Thread-java.lang.ThreadGroup-java.lang.Runnable->.

Your test isn’t valid because you have 3 threads. The first is the main thread with a thread
group of main, the second thread is created in the first Thread but directly associated with
thread group “my group”. The third thread is created in thread “main” and so is in
ThreadGroup main. While you may have created the third Thread within the scope of the second
Thread Object, the code to create the third thread was not executed within the execution of
Thread 2 as this program only has a single thread of execution. Thread 2 and 3 are never started.

In other words Thread 3 must be executed from the call stack of Thread 2’s run method while
Thread 2 is in control of the execution.

Ralph

> On Apr 24, 2019, at 9:21 AM, Benjamin Jaton <benjamin.jaton@gmail.com> wrote:
> 
> Could you point me to the relevant section?
> 
> I did the following test:
> final ThreadGroup g = new ThreadGroup("mygroup");
> Thread t1 = new Thread(g, () -> {
> Thread t2 = new Thread(() -> { });
> System.out.println("t2 threadgroup = " + t2.getThreadGroup().getName());
> });
> System.out.println("t1 threadgroup = " + t1.getThreadGroup().getName());
> t1.run();
> 
> And I get:
> t1 threadgroup = mygroup
> t2 threadgroup = main
> 
> t2 is started from t1 yet didn't inherit the threadgroup. What am I missing?
> 
> On Wed, Apr 24, 2019 at 6:05 AM Apache <ralph.goers@dslextreme.com> wrote:
> 
>> My reading of the javadoc for Thread indicates the do by default.
>> 
>> Ralph
>> 
>> On Apr 23, 2019, at 10:12 PM, Benjamin Jaton <benjamin.jaton@gmail.com>
>> wrote:
>> 
>>>> If you want all the threads in a “job” then I would create the parent
>>> thread with its own thread group and use the thread group name in the
>>> lookup.
>>> 
>>> But how do I assign the thread group to threads that 3rd party libraries
>>> create? I don't think child threads naturally inherit the ThreadGroup of
>>> their parents.
>>> 
>>> On Tue, Apr 23, 2019 at 8:36 PM Ralph Goers <ralph.goers@dslextreme.com>
>>> wrote:
>>> 
>>>> I think the solution is pretty simple. The RoutingAppender doesn’t only
>>>> work with the ThreadContext. It works using a lookup. So if you were to
>> use
>>>> a ThreadLookup that used ${{thread:id}} you would get a new Appender for
>>>> each thread id. To be honest, I am not sure why we haven’t created a
>>>> ThreadLookup before. I could easily see multiple places were the thread
>> id,
>>>> name, priority or ThreadGroup name might want to be used.
>>>> 
>>>> If you want all the threads in a “job” then I would create the parent
>>>> thread with its own thread group and use the thread group name in the
>>>> lookup.
>>>> 
>>>> Ralph
>>>> 
>>>>> On Apr 23, 2019, at 5:06 PM, Benjamin Jaton <benjamin.jaton@gmail.com>
>>>> wrote:
>>>>> 
>>>>> Hello,
>>>>> 
>>>>> Several times I've been in a situation where in a given JVM I am trying
>>>> to
>>>>> run distinct jobs in separate threads, who themselves might spawn their
>>>> own
>>>>> threads.
>>>>> In those situations I usually want the logging of each job in a
>> separate
>>>>> log file, and that has proven to be difficult.
>>>>> 
>>>>> Log4j2 has a routing appender that allows to create a separate appender
>>>> for
>>>>> each job given that you can provide a routing key that's unique for
>> each
>>>>> job. But what key to use for this?
>>>>> I've been using a ThreadContext variable that I set at the level of the
>>>> job
>>>>> thread, and any child thread that I have control over.
>>>>> 
>>>>> But the problem is that I don't always have control over this.
>> Sometimes
>>>>> third party APIs let you feed a custom ThreadFactory, sometimes they
>>>> don't.
>>>>> When they don't, I can't set that ThreadContext variable and part of
>> the
>>>>> job logging will be misrouted to a different appender.
>>>>> 
>>>>> Is there a way to work around this so that there is 1 log file for each
>>>> job
>>>>> that would gather all the logging of the sub threads?
>>>>> 
>>>>> Thanks,
>>>>> Benjamin
>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
>>>> For additional commands, e-mail: log4j-user-help@logging.apache.org
>>>> 
>>>> 
>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
>> For additional commands, e-mail: log4j-user-help@logging.apache.org
>> 
>> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message