[ 
https://issues.apache.org/jira/browse/LOGGING-137?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12900017#action_12900017
 ] 

Doug Bateman commented on LOGGING-137:
--------------------------------------

The other concern I have that even the Java 1.4 approach of using 
Throwable.getStackTrace() may have variations across JVMs.  Hence I feel it's 
better to calculate once rather than assume a hard coded constant.

Specifically, the Java 1.4.2 JavaDoc for Throwable.getStackTrace() reads:

     "Some virtual machines may, under some circumstances, omit one or more 
stack frames from the stack trace. In the extreme case, a virtual machine that 
has no stack trace information concerning this throwable is permitted to return 
a zero-length array from this method. Generally speaking, the array returned by 
this method will contain one element for every frame that would be printed by 
printStackTrace. "

And even Throwable.fillInStackTrace() doesn't specify what is considered the 
top of the call stack.  It only takes one JVM vendor to do things differently 
to throw a wrench in the works.  For example, a JVM vendor might include 
Throwable.fillInStackTrace() itself in the call stack returned, even though the 
Sun JRE does not.

This is why I prefer the approach of actually calculating it once in a static 
initializer.  It avoids the issue.  However, we could do the simple approach by 
waiting to see if it becomes a reported issue before introducing added 
complexity.  And developers encountering problems can always revert to using 
the Logger.getLogger(name) approach.

> LogFactory.getLog()
> -------------------
>
>                 Key: LOGGING-137
>                 URL: https://issues.apache.org/jira/browse/LOGGING-137
>             Project: Commons Logging
>          Issue Type: New Feature
>    Affects Versions: 1.1.2
>            Reporter: Doug Bateman
>         Attachments: CallStackTestCase.java, CallStackUtil.java.0, 
> CallStackUtil.java.1, CallStackUtil.java.2, LogFactory.java
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> Presently, in Apache Commons, the most common way to get a logger is to do 
> something like:
> public class MyClass {
>     private static Log log = LogFactory.getLog(MyClass.class);
> }
> Notice how MyClass.class (or alternatively a string name) is passed as a 
> parameter.  The annoying aspect of this is that sometimes the class name 
> doesn't get updated when doing copy/paste operations.  A desirable 
> alternative might be:
> public class MyClass {
>     private static Log log = LogFactory.getLog(); //class name inferred from 
> call stack
> }
> With such an approach there are two possible concerns I can foresee:
>     * Call stack inspection isn't terribly fast.  However since Loggers are 
> generally initialized only once, when the class is first loaded, performance 
> isn't likely to be a major problem.
>     * Commons-logging is Java 1.1 compatible.  Thus care must be taken to 
> ensure compatibility isn't broken.
>     * Commons-logging doesn't depend on commons-lang, and thus the utilities 
> in commons-lang cannot be used.
> In Java 1.4, the call stack is easily obtained using Thread.getCallStack().  
> Prior to Java 1.4, the only way to obtain the call stack is to inspect the 
> stack trace of an exception.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to