[slf4j-user] Upgrading from commons logging using SLF4J Migrator
lewis john mcgibbney
lewis.mcgibbney at gmail.com
Fri Sep 23 19:17:23 CEST 2011
Hi Ceki,
This information has saved me a lot of digging, however having viewed the
logging throughout the Nutch code base, I am personally tempted to move
towards the first of your suggestions. As you explained I was aware that
this was the de facto method for logging errors, and this is present
throughout various areas of the code. I must thank you very much for your
suggestions.
Lewis
On Fri, Sep 23, 2011 at 3:52 PM, Ceki Gulcu <ceki at qos.ch> wrote:
> Hi Lewis,
>
> The problem has to do with how LogUtil is implemented.
> Here are two possible solutions.
>
> 1) Get rid of the LogUtil class. For example, in HttpBase, instead of
>
>
> } catch (Throwable e) {
> e.printStackTrace(LogUtil.**getErrorStream(logger));
> return new ProtocolOutput(null, new ProtocolStatus(e));
> }
>
> write instead
>
> } catch (Throwable e) {
> logger.error("Failed to get protocol output", e);
>
> return new ProtocolOutput(null, new ProtocolStatus(e));
> }
>
> This latter form is the standard way of logging exceptions.
> You would need to repeat this operation in all places where LogUtil is
> used. There are about 60 such places located in about a dozen classes.
>
> 2) In LogUtil, replace
>
> static {
> try {
> TRACE=Logger.class.getMethod("**trace", new Class[] { Object.class });
> DEBUG=Logger.class.getMethod("**debug", new Class[] { Object.class });
> INFO=Logger.class.getMethod("**info", new Class[] { Object.class });
> } catch ...
> }
> }
>
> with
>
> static {
> try {
> TRACE=Logger.class.getMethod("**trace", new Class[] {String.class});
> DEBUG=Logger.class.getMethod("**debug", new Class[] {String.class});
> INFO=Logger.class.getMethod("**info", new Class[] {String.class});
> } catch ...
> }
> }
>
> On line 104 change
> method.invoke(logger, new Object[] {toString().trim() });
> to
> method.invoke(logger, new String[] {toString().trim() });
>
>
> Unless there is a good reason not to, I would get rid of LogUtil in Nutch.
> It seems like a very convoluted way for logging exceptions. But maybe I am
> missing the bigger picture...
>
> HTH,
> --
> Ceki
>
>
> On 23.09.2011 14:49, lewis john mcgibbney wrote:
>
>> Hi list,
>>
>> I'm working on the task of upgrading our Apache Nutch codebase to use
>> SLF4J with Log4J backend, therefore using the migrator. Testing in a
>> development environment all JUnit tests, build and compile ant tasks
>> pass successfully, however when moving into production (when exceptions
>> are caught) we are having some problems. The full JIRA issue can be seen
>> here[1].
>>
>> Namely the following class [2] at around this code snippet
>> {code}
>>
>> } catch (Throwable e) {
>> e.printStackTrace(LogUtil.**getErrorStream(logger));
>> return new ProtocolOutput(null, new ProtocolStatus(e));
>> }
>> }
>>
>> /* -------------------------- *
>> *</implementation:Protocol> *
>> * -------------------------- */
>>
>> {code}
>>
>> To be honest, I'm pretty stumped as I've read all of the migrator
>> documentation and not surprisingly as far as I know, none seems to be
>> specific enough to address this issue. Does anyone have any suggestions
>> as to how this code can be manually edited to prevent the various errors
>> occuring as shown below.
>>
>> 2011-09-22 19:36:02,046 ERROR org.apache.nutch.util.LogUtil: Cannot log
>> with method [null]
>> java.lang.NullPointerException
>> at org.apache.nutch.util.LogUtil$**1.flush(LogUtil.java:103)
>> at java.io.PrintStream.write(**PrintStream.java:432)
>> at sun.nio.cs.StreamEncoder.**writeBytes(StreamEncoder.java:**202)
>> at sun.nio.cs.StreamEncoder.**implFlushBuffer(StreamEncoder.**
>> java:272)
>> at sun.nio.cs.StreamEncoder.**flushBuffer(StreamEncoder.**java:85)
>> at java.io.OutputStreamWriter.**flushBuffer(**
>> OutputStreamWriter.java:168)
>> at java.io.PrintStream.newLine(**PrintStream.java:496)
>> at java.io.PrintStream.println(**PrintStream.java:774)
>> at java.lang.Throwable.**printStackTrace(Throwable.**java:461)
>> at org.apache.nutch.protocol.**http.api.HttpBase.**
>> getProtocolOutput(HttpBase.**java:197)<<<<<<< HERE
>> at org.apache.nutch.fetcher.**Fetcher$FetcherThread.run(**
>> Fetcher.java:665)
>>
>> 2011-09-22 19:44:26,929 ERROR org.apache.nutch.util.LogUtil: Cannot init
>> log methods
>> java.lang.**NoSuchMethodException: org.slf4j.Logger.trace(java.**
>> lang.Object)
>> at java.lang.Class.getMethod(**Class.java:1605)
>> at org.apache.nutch.util.LogUtil.**<clinit>(LogUtil.java:48)
>> at org.apache.nutch.protocol.**http.api.HttpBase.**
>> getProtocolOutput(HttpBase.**java:197)<<<<<<< HERE
>> at org.apache.nutch.fetcher.**Fetcher$FetcherThread.run(**
>> Fetcher.java:665)
>>
>>
>> Thank you kindly in advance for any suggestions.
>>
>> Lewis
>>
>> [1] https://issues.apache.org/**jira/browse/NUTCH-1078<https://issues.apache.org/jira/browse/NUTCH-1078>
>> [2]
>> https://svn.apache.org/repos/**asf/nutch/branches/branch-1.4/**
>> src/plugin/lib-http/src/java/**org/apache/nutch/protocol/**
>> http/api/HttpBase.java<https://svn.apache.org/repos/asf/nutch/branches/branch-1.4/src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java>
>> [3] http://www.slf4j.org/migrator.**html<http://www.slf4j.org/migrator.html>
>> --
>> /Lewis/
>>
>>
>> ______________________________**_________________
> slf4j-user mailing list
> slf4j-user at qos.ch
> http://qos.ch/mailman/**listinfo/slf4j-user<http://qos.ch/mailman/listinfo/slf4j-user>
>
--
*Lewis*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://qos.ch/pipermail/slf4j-user/attachments/20110923/c06819dd/attachment-0001.html>
More information about the slf4j-user
mailing list