You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Jacob Kjome <ho...@visi.com> on 2006/09/17 21:39:36 UTC

Re: Logger.getRootLogger() ?? is't static with respect to the JVM ?

At 05:42 PM 9/16/2006, you wrote:
 >Hello every body:
 >I am having some difficulties working with log4j, and I need some help
 >from some one.
 >I am writing a client/server application, in some way it can be compared
 >with a chat client, where two or more users connect to the server
 >through an applet.
 >Now the applets uses classes from packages I wrote. The classes logges
 >messages to no where (no logger is configured in them) I left the
 >configuration for the main class, so that I can reuse those classes
 >elsewhere. I am using a simple appender that I wrote, to display the
 >logs in a JFrame.
 >The problem is I am getting the logs from each applet displayed in it's
 >own log JFrame and in the other one!!
 >I am testing this on my machine, now both chat programs (applets)
 >connect to the server. The first one logs the messages to both Frames !!
 >And the second one does the same.
 >
 >At the begining of each applet I used this:
 >//********************************************
 >logger = Logger.getLogger(this.getClass());
 >Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller
 >logs"));
 >logger.setLevel(Level.ALL);
 >BasicConfigurator.configure();
 >//********************************************
 >
 >from what I understand, Logger.getRootLogger() is a static method,
 >therefore the logger returned by it ( Logger.getRootLogger() ) is
 >static, but static means for each JVM. In other words, both applets run
 >in a separate JVMs, and there should be nothing shared !!!
 >

Are you sure your expectation of a separate JVM for each applet is 
valid?  From my experience, when a Java Applet is first loaded, the 
JVM starts up.  If you go to another page, I'm pretty sure no other 
JVM is started.   The second applet simply uses the running JVM.  And 
based on the behavior you see, I think this is confirmed.  A couple 
questions, though...

1.  Are the two separate instances of the chat applet started in the 
same browser session or completely separate browsers such as Firefox and IE?
2.  Are they, in fact, the same applet, or two different chat 
applications talking to the same server?  If the JVM doesn't normally 
get shared across applets (which, again, may be an invalid 
assumption), maybe it does if the applet instances are from the same codebase?
3.  Is it possible that even with separate browsers, the Java Plugin 
provides a single shared JVM environment across browsers?

 >Now, what ever was the reason, how do I get around this ??? Let's say My
 >main class is called Chat.java , and it uses another class CustomSocket.java
 >What i would do in CustomSocket.java, is instantiate an object of Logger
 >through  Logger.getLogger(this.getClass()), and logs  my messages
 >normally. Then the application that  uses CustomSocket has to configure
 >the logger (apender, Level ,....etc). How do I achive this. Please note
 >that I am only newbie, and I am not looking to use configuration files.
 >Just doing very basic configuration.
 >If you need any more info about this problem, just please let me know, I
 >'ve included what I think is relevant.

Interesting problem.  Sounds like you need a repository selector that 
selects on classloader or some other available criteria that can 
provide  differentiation between application instances.  The problem 
is that repository selectors must be set once and if the applet that 
sets the selector is unloaded, the other applets will cease to log 
properly and won't be able to reset the selector, since it is 
protected by a guard object.

Anyone else have idea's here?  I haven't had to tackle this issue in 
an applet environment, only a server environment where I have full 
control of  the server.

Jake

 >Thank you.


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


Re: Logger.getRootLogger() ?? is't static with respect to the JVM ?

Posted by Vijay <ac...@gmail.com>.
>  >What i would do in CustomSocket.java, is instantiate an object of Logger
>  >through  Logger.getLogger(this.getClass()), and logs  my messages
>  >normally. Then the application that  uses CustomSocket has to configure
>  >the logger (apender, Level ,....etc). How do I achive this. Please note
>  >that I am only newbie, and I am not looking to use configuration files.
>  >Just doing very basic configuration.
>  >If you need any more info about this problem, just please let me know, I
>  >'ve included what I think is relevant.
> 

This problem looks similar to mine.
I have tried to do this by overriding the RootLogger.
In my case, I have two applications which used the Same core.jar.
Each of the applications had to write to their respective log files.
during the application init, we override the RootLogger
by adding this 

rootLogger.addAppender(appSpecificAppender);

This has worked for me.
I would appreciate if someone can correct me in handling this problem.

Thanks 
Vj





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


Re: Logger.getRootLogger() ?? is't static with respect to the JVM ?

Posted by Jacob Kjome <ho...@visi.com>.
Thanks for confirming that the same JVM is used.  At this point, you 
have to look at the applet classloading model.  If both applets end 
up being loaded in the same classloader, then they will both be using 
the same instance of Log4j.  If this is true, then both apps will be 
running within the same logger repository.  Actually, it's a little 
scary that this would happen, since once the first app unloads, you'd 
think that logging would cease to work... or maybe since the second 
app is still using the first app's resources (log4j), then the first 
app will actually still exist as long as  another app is using its 
resources.  I would have thought they'd have loaded in separate 
classloaders that couldn't see each other even if they shared the same JVM.

You might want to post on the Sun forums to see what they have to say 
about this behavior.  This doesn't seem to be a Log4j specific 
issue.  I think JDK1.4 logging would have the same problem.  You 
might want to verify that.

Jake

At 03:29 PM 9/17/2006, you wrote:
 >you were right: They are using the same JVM,
 >ps -A gives
 >15644 ?        00:00:00 firefox
 >15664 ?        00:00:00 run-mozilla.sh
 >15669 ?        00:00:02 firefox-bin
 >15674 ?        00:02:05 java_vm
 >15985 pts/0    00:00:00 ps
 >when both are running
 >However, I found few JVMs processes (zombies), kiled them, and restarted
 >my application. Things went fine.
 >I am going to keep on testing, if I find any issues, I will let you know.
 >
 >
 >Mansour wrote:
 >
 >> Jacob:
 >> Here's what I have,
 >> 1- both applications are opend in totally different browsers.
 >> 2- in fact both applications are totally different, the applets are
 >> (Host.java , Controller.java).
 >> 3- the last assumption might be true about firefox providing one
 >> shared JVM throug the plugin. I will launch a search for this, and
 >> find out what's going on.
 >>
 >> I am not looking to expand my skills in log4j and use repository
 >> selector, as I need not to be confused about the basics. I am new to
 >> log4j as you know. May be in a later time, I will.
 >>
 >> From what I understand, is that my design for reusable component is
 >> correct. Again, I am creating a private logger in each class, and log
 >> to that logger, without configuring it. The configuration is taking
 >> place only in the application that uses this component, by configuring
 >> the rootLogger.
 >>
 >> So, in each class, I do this:
 >> Logger logger = Logger.getLogger(this.getClass());
 >> logger.info("this is a component class");
 >>
 >> In the application class:
 >> Logger logger = Logger.getLogger(this.getClass());
 >> Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller
 >> logs"));
 >>
 >> logger.setLevel(Level.ALL);
 >> BasicConfigurator.configure();
 >> logger.info("this is the application class");
 >>
 >> The heirerachy I am expecting is as follow:
 >>
 >> rootLogger
 >> / | \
 >> comp1Logger mainLogger comp2Logger
 >>
 >>
 >> If that's correct then let me know please. I will let you know soon
 >> about the JVM issue. I am using Fedora 4 _64.
 >> FireFox and JRE are built for x86_32. I had to do this to get support
 >> for flash. I will see what I can do.
 >>
 >> Thanks
 >>
 >>
 >>
 >> Jacob Kjome wrote:
 >>
 >>> At 05:42 PM 9/16/2006, you wrote:
 >>> >Hello every body:
 >>> >I am having some difficulties working with log4j, and I need some help
 >>> >from some one.
 >>> >I am writing a client/server application, in some way it can be
 >>> compared
 >>> >with a chat client, where two or more users connect to the server
 >>> >through an applet.
 >>> >Now the applets uses classes from packages I wrote. The classes logges
 >>> >messages to no where (no logger is configured in them) I left the
 >>> >configuration for the main class, so that I can reuse those classes
 >>> >elsewhere. I am using a simple appender that I wrote, to display the
 >>> >logs in a JFrame.
 >>> >The problem is I am getting the logs from each applet displayed in it's
 >>> >own log JFrame and in the other one!!
 >>> >I am testing this on my machine, now both chat programs (applets)
 >>> >connect to the server. The first one logs the messages to both
 >>> Frames !!
 >>> >And the second one does the same.
 >>> >
 >>> >At the begining of each applet I used this:
 >>> >//********************************************
 >>> >logger = Logger.getLogger(this.getClass());
 >>> >Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller
 >>> >logs"));
 >>> >logger.setLevel(Level.ALL);
 >>> >BasicConfigurator.configure();
 >>> >//********************************************
 >>> >
 >>> >from what I understand, Logger.getRootLogger() is a static method,
 >>> >therefore the logger returned by it ( Logger.getRootLogger() ) is
 >>> >static, but static means for each JVM. In other words, both applets run
 >>> >in a separate JVMs, and there should be nothing shared !!!
 >>> >
 >>>
 >>> Are you sure your expectation of a separate JVM for each applet is
 >>> valid? From my experience, when a Java Applet is first loaded, the
 >>> JVM starts up. If you go to another page, I'm pretty sure no other
 >>> JVM is started. The second applet simply uses the running JVM. And
 >>> based on the behavior you see, I think this is confirmed. A couple
 >>> questions, though...
 >>>
 >>> 1. Are the two separate instances of the chat applet started in the
 >>> same browser session or completely separate browsers such as Firefox
 >>> and IE?
 >>> 2. Are they, in fact, the same applet, or two different chat
 >>> applications talking to the same server? If the JVM doesn't normally
 >>> get shared across applets (which, again, may be an invalid
 >>> assumption), maybe it does if the applet instances are from the same
 >>> codebase?
 >>> 3. Is it possible that even with separate browsers, the Java Plugin
 >>> provides a single shared JVM environment across browsers?
 >>>
 >>> >Now, what ever was the reason, how do I get around this ??? Let's
 >>> say My
 >>> >main class is called Chat.java , and it uses another class
 >>> CustomSocket.java
 >>> >What i would do in CustomSocket.java, is instantiate an object of
 >>> Logger
 >>> >through Logger.getLogger(this.getClass()), and logs my messages
 >>> >normally. Then the application that uses CustomSocket has to configure
 >>> >the logger (apender, Level ,....etc). How do I achive this. Please note
 >>> >that I am only newbie, and I am not looking to use configuration files.
 >>> >Just doing very basic configuration.
 >>> >If you need any more info about this problem, just please let me
 >>> know, I
 >>> >'ve included what I think is relevant.
 >>>
 >>> Interesting problem. Sounds like you need a repository selector that
 >>> selects on classloader or some other available criteria that can
 >>> provide differentiation between application instances. The problem is
 >>> that repository selectors must be set once and if the applet that
 >>> sets the selector is unloaded, the other applets will cease to log
 >>> properly and won't be able to reset the selector, since it is
 >>> protected by a guard object.
 >>>
 >>> Anyone else have idea's here? I haven't had to tackle this issue in
 >>> an applet environment, only a server environment where I have full
 >>> control of the server.
 >>>
 >>> Jake
 >>>
 >>> >Thank you.
 >>>
 >>>
 >>> ---------------------------------------------------------------------
 >>> 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
 >>
 >
 >
 >---------------------------------------------------------------------
 >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


Re: Logger.getRootLogger() ?? is't static with respect to the JVM ?

Posted by Mansour <ma...@ownmail.net>.
you were right: They are using the same JVM,
ps -A gives
15644 ?        00:00:00 firefox
15664 ?        00:00:00 run-mozilla.sh
15669 ?        00:00:02 firefox-bin
15674 ?        00:02:05 java_vm
15985 pts/0    00:00:00 ps
when both are running
However, I found few JVMs processes (zombies), kiled them, and restarted 
my application. Things went fine.
I am going to keep on testing, if I find any issues, I will let you know.


Mansour wrote:

> Jacob:
> Here's what I have,
> 1- both applications are opend in totally different browsers.
> 2- in fact both applications are totally different, the applets are 
> (Host.java , Controller.java).
> 3- the last assumption might be true about firefox providing one 
> shared JVM throug the plugin. I will launch a search for this, and 
> find out what's going on.
>
> I am not looking to expand my skills in log4j and use repository 
> selector, as I need not to be confused about the basics. I am new to 
> log4j as you know. May be in a later time, I will.
>
> From what I understand, is that my design for reusable component is 
> correct. Again, I am creating a private logger in each class, and log 
> to that logger, without configuring it. The configuration is taking 
> place only in the application that uses this component, by configuring 
> the rootLogger.
>
> So, in each class, I do this:
> Logger logger = Logger.getLogger(this.getClass());
> logger.info("this is a component class");
>
> In the application class:
> Logger logger = Logger.getLogger(this.getClass());
> Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller 
> logs"));
>
> logger.setLevel(Level.ALL);
> BasicConfigurator.configure();
> logger.info("this is the application class");
>
> The heirerachy I am expecting is as follow:
>
> rootLogger
> / | \
> comp1Logger mainLogger comp2Logger
>
>
> If that's correct then let me know please. I will let you know soon 
> about the JVM issue. I am using Fedora 4 _64.
> FireFox and JRE are built for x86_32. I had to do this to get support 
> for flash. I will see what I can do.
>
> Thanks
>
>
>
> Jacob Kjome wrote:
>
>> At 05:42 PM 9/16/2006, you wrote:
>> >Hello every body:
>> >I am having some difficulties working with log4j, and I need some help
>> >from some one.
>> >I am writing a client/server application, in some way it can be 
>> compared
>> >with a chat client, where two or more users connect to the server
>> >through an applet.
>> >Now the applets uses classes from packages I wrote. The classes logges
>> >messages to no where (no logger is configured in them) I left the
>> >configuration for the main class, so that I can reuse those classes
>> >elsewhere. I am using a simple appender that I wrote, to display the
>> >logs in a JFrame.
>> >The problem is I am getting the logs from each applet displayed in it's
>> >own log JFrame and in the other one!!
>> >I am testing this on my machine, now both chat programs (applets)
>> >connect to the server. The first one logs the messages to both 
>> Frames !!
>> >And the second one does the same.
>> >
>> >At the begining of each applet I used this:
>> >//********************************************
>> >logger = Logger.getLogger(this.getClass());
>> >Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller
>> >logs"));
>> >logger.setLevel(Level.ALL);
>> >BasicConfigurator.configure();
>> >//********************************************
>> >
>> >from what I understand, Logger.getRootLogger() is a static method,
>> >therefore the logger returned by it ( Logger.getRootLogger() ) is
>> >static, but static means for each JVM. In other words, both applets run
>> >in a separate JVMs, and there should be nothing shared !!!
>> >
>>
>> Are you sure your expectation of a separate JVM for each applet is 
>> valid? From my experience, when a Java Applet is first loaded, the 
>> JVM starts up. If you go to another page, I'm pretty sure no other 
>> JVM is started. The second applet simply uses the running JVM. And 
>> based on the behavior you see, I think this is confirmed. A couple 
>> questions, though...
>>
>> 1. Are the two separate instances of the chat applet started in the 
>> same browser session or completely separate browsers such as Firefox 
>> and IE?
>> 2. Are they, in fact, the same applet, or two different chat 
>> applications talking to the same server? If the JVM doesn't normally 
>> get shared across applets (which, again, may be an invalid 
>> assumption), maybe it does if the applet instances are from the same 
>> codebase?
>> 3. Is it possible that even with separate browsers, the Java Plugin 
>> provides a single shared JVM environment across browsers?
>>
>> >Now, what ever was the reason, how do I get around this ??? Let's 
>> say My
>> >main class is called Chat.java , and it uses another class 
>> CustomSocket.java
>> >What i would do in CustomSocket.java, is instantiate an object of 
>> Logger
>> >through Logger.getLogger(this.getClass()), and logs my messages
>> >normally. Then the application that uses CustomSocket has to configure
>> >the logger (apender, Level ,....etc). How do I achive this. Please note
>> >that I am only newbie, and I am not looking to use configuration files.
>> >Just doing very basic configuration.
>> >If you need any more info about this problem, just please let me 
>> know, I
>> >'ve included what I think is relevant.
>>
>> Interesting problem. Sounds like you need a repository selector that 
>> selects on classloader or some other available criteria that can 
>> provide differentiation between application instances. The problem is 
>> that repository selectors must be set once and if the applet that 
>> sets the selector is unloaded, the other applets will cease to log 
>> properly and won't be able to reset the selector, since it is 
>> protected by a guard object.
>>
>> Anyone else have idea's here? I haven't had to tackle this issue in 
>> an applet environment, only a server environment where I have full 
>> control of the server.
>>
>> Jake
>>
>> >Thank you.
>>
>>
>> ---------------------------------------------------------------------
>> 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
>


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


Re: Logger.getRootLogger() ?? is't static with respect to the JVM ?

Posted by Mansour <ma...@ownmail.net>.
Jacob:
Here's what I have,
1- both applications are opend in totally different browsers.
2- in fact both applications are totally different, the applets are 
(Host.java , Controller.java).
3- the last assumption might be true about firefox providing one shared 
JVM throug the plugin. I will launch a search for this, and find out 
what's going on.

I am not looking to expand my skills in log4j and use repository 
selector, as I need not to be confused about the basics. I am new to 
log4j as you know. May be in a later time, I will.

 From what I understand, is that my design for reusable component is 
correct. Again, I am creating a private logger in each class, and log to 
that logger, without configuring it. The configuration is taking place 
only in the application that uses this component, by configuring the 
rootLogger.

So, in each class, I do this:
Logger logger = Logger.getLogger(this.getClass());
logger.info("this is a component class");

In the application class:
Logger logger = Logger.getLogger(this.getClass());
Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller 
logs"));

logger.setLevel(Level.ALL);
BasicConfigurator.configure();
logger.info("this is the application class");

The heirerachy I am expecting is as follow:

rootLogger
/ | \
comp1Logger mainLogger comp2Logger


If that's correct then let me know please. I will let you know soon 
about the JVM issue. I am using Fedora 4 _64.
FireFox and JRE are built for x86_32. I had to do this to get support 
for flash. I will see what I can do.

Thanks



Jacob Kjome wrote:

> At 05:42 PM 9/16/2006, you wrote:
> >Hello every body:
> >I am having some difficulties working with log4j, and I need some help
> >from some one.
> >I am writing a client/server application, in some way it can be compared
> >with a chat client, where two or more users connect to the server
> >through an applet.
> >Now the applets uses classes from packages I wrote. The classes logges
> >messages to no where (no logger is configured in them) I left the
> >configuration for the main class, so that I can reuse those classes
> >elsewhere. I am using a simple appender that I wrote, to display the
> >logs in a JFrame.
> >The problem is I am getting the logs from each applet displayed in it's
> >own log JFrame and in the other one!!
> >I am testing this on my machine, now both chat programs (applets)
> >connect to the server. The first one logs the messages to both Frames !!
> >And the second one does the same.
> >
> >At the begining of each applet I used this:
> >//********************************************
> >logger = Logger.getLogger(this.getClass());
> >Logger.getRootLogger().addAppender(new FrameAppender(this,"Controller
> >logs"));
> >logger.setLevel(Level.ALL);
> >BasicConfigurator.configure();
> >//********************************************
> >
> >from what I understand, Logger.getRootLogger() is a static method,
> >therefore the logger returned by it ( Logger.getRootLogger() ) is
> >static, but static means for each JVM. In other words, both applets run
> >in a separate JVMs, and there should be nothing shared !!!
> >
>
> Are you sure your expectation of a separate JVM for each applet is 
> valid? From my experience, when a Java Applet is first loaded, the JVM 
> starts up. If you go to another page, I'm pretty sure no other JVM is 
> started. The second applet simply uses the running JVM. And based on 
> the behavior you see, I think this is confirmed. A couple questions, 
> though...
>
> 1. Are the two separate instances of the chat applet started in the 
> same browser session or completely separate browsers such as Firefox 
> and IE?
> 2. Are they, in fact, the same applet, or two different chat 
> applications talking to the same server? If the JVM doesn't normally 
> get shared across applets (which, again, may be an invalid 
> assumption), maybe it does if the applet instances are from the same 
> codebase?
> 3. Is it possible that even with separate browsers, the Java Plugin 
> provides a single shared JVM environment across browsers?
>
> >Now, what ever was the reason, how do I get around this ??? Let's say My
> >main class is called Chat.java , and it uses another class 
> CustomSocket.java
> >What i would do in CustomSocket.java, is instantiate an object of Logger
> >through Logger.getLogger(this.getClass()), and logs my messages
> >normally. Then the application that uses CustomSocket has to configure
> >the logger (apender, Level ,....etc). How do I achive this. Please note
> >that I am only newbie, and I am not looking to use configuration files.
> >Just doing very basic configuration.
> >If you need any more info about this problem, just please let me know, I
> >'ve included what I think is relevant.
>
> Interesting problem. Sounds like you need a repository selector that 
> selects on classloader or some other available criteria that can 
> provide differentiation between application instances. The problem is 
> that repository selectors must be set once and if the applet that sets 
> the selector is unloaded, the other applets will cease to log properly 
> and won't be able to reset the selector, since it is protected by a 
> guard object.
>
> Anyone else have idea's here? I haven't had to tackle this issue in an 
> applet environment, only a server environment where I have full 
> control of the server.
>
> Jake
>
> >Thank you.
>
>
> ---------------------------------------------------------------------
> 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