Thanks for sharing, I think indeed loggings should be taken more seriously
in this project.

Le ven. 6 déc. 2019 à 18:53, David Mollitor <dam6...@gmail.com> a écrit :

> ---------- Forwarded message ---------
> From: David Mollitor <dam6...@gmail.com>
> Date: Fri, Dec 6, 2019 at 12:52 PM
> Subject: Re: Error Handling and Logging
> To: <d...@hbase.apache.org>
>
>
> Hell Team,
>
> I'm not sure how to automate this, but as I scan through the log
> statements, another thing I am observing is the following:
>
> 1// Lots of punctuation.  There is no need to yell (!!!) or to try to be
> proper (.).  Please be concise and most log messages do not end with a
> period
> 2// Contractions.  Please do not use contractions (can't, won't we're)
> these are harder words for our international friends
> 3// Use strong words. Avoid phases like "couldn't complete the action" and
> instead consider using something like "failed to complete action".  The
> word "fail" is trained into me much more than the word "couldn't"
>
> Thanks so much for all the positive feedback I've received from the HBase
> team here and in private conversations.
>
>
>
> On Thu, Dec 5, 2019 at 1:10 PM Nick Dimiduk <ndimi...@apache.org> wrote:
>
> > I think these are good points all around. Can any of these anti-patterns
> be
> > flagged by a checkstyle rule? Static analysis would make the infractions
> > easier to track down.
> >
> > One more point of my own: I’m of the opinion that we log too much in
> > general. Info level should not describe the details of operations as
> > normal. I’m also not a fan of logging data structure “status”messages, as
> > we do, for example, from the block cache. It’s enough to expose these as
> > metrics.
> >
> > Thanks for speaking up! If you’re feeling ambitious, please ping me on
> any
> > PRs and we’ll get things cleaned up.
> >
> > Thanks,
> > Nick
> >
> > On Tue, Dec 3, 2019 at 21:02 Stack <st...@duboce.net> wrote:
> >
> > > Thanks for the helpful note David. Appreciated.
> > > S
> > >
> > > On Tue, Nov 26, 2019 at 1:44 PM David Mollitor <dam6...@gmail.com>
> > wrote:
> > >
> > > > Hello Team,
> > > >
> > > > I am one of many people responsible for supporting the Hadoop
> products
> > > out
> > > > in the field.  Error handling and logging are crucial to my success.
> > > I've
> > > > been reading over the code and I see many of the same mistakes again
> > and
> > > > again.  I just wanted to bring some of these things to your attention
> > so
> > > > that moving forward, we can make these products better.
> > > >
> > > > The general best-practice is:
> > > >
> > > > public class TestExceptionLogging
> > > > {
> > > >   private static final Logger LOG =
> > > > LoggerFactory.getLogger(TestExceptionLogging.class);
> > > >
> > > >   public static void main(String[] args) {
> > > >     try {
> > > >       processData();
> > > >     } catch (Exception e) {
> > > >       LOG.error("Application failed", e);
> > > >     }
> > > >   }
> > > >
> > > >   public static void processData() throws Exception {
> > > >     try {
> > > >       readData();
> > > >     } catch (Exception e) {
> > > >       throw new Exception("Failed to process data", e);
> > > >     }
> > > >   }
> > > >
> > > >   public static byte[] readData() throws Exception {
> > > >     throw new IOException("Failed to read device");
> > > >   }
> > > > }
> > > >
> > > > Produces:
> > > >
> > > > [main] ERROR TestExceptionLogging - Application failed
> > > > java.lang.Exception: Failed to process data
> > > > at TestExceptionLogging.processData(TestExceptionLogging.java:22)
> > > > at TestExceptionLogging.main(TestExceptionLogging.java:12)
> > > > Caused by: java.io.IOException: Failed to read device
> > > > at TestExceptionLogging.readData(TestExceptionLogging.java:27)
> > > > at TestExceptionLogging.processData(TestExceptionLogging.java:20)
> > > > ... 1 more
> > > >
> > > >
> > > >
> > > > Please notice that when an exception is thrown, and caught, it is
> > wrapped
> > > > at each level and each level adds some more context to describe what
> > was
> > > > happening when the error occurred.  It also produces a complete stack
> > > trace
> > > > that pinpoints the issue.  For Hive folks, it is rarely the case
> that a
> > > > method consuming a HMS API call should itself throw a MetaException.
> > The
> > > > MetaException has no way of wrapping an underlying Exception and
> > helpful
> > > > data is often loss.  A method may chooses to wrap a MetaException,
> but
> > it
> > > > should not be throwing them around as the default behavior.
> > > >
> > > > Also important to note is that there is exactly one place that is
> doing
> > > the
> > > > logging.  There does not need to be any logging at the lower
> levels.  A
> > > > catch block should throw or log, not both.  This is an anti-pattern
> and
> > > > annoying as the end user: having to deal with multiple stack traces
> at
> > > > different log levels for the same error condition.  The log message
> > > should
> > > > be at the highest level only.
> > > >
> > > > https://community.oracle.com/docs/DOC-983543#logAndThrow
> > > >
> > > > Both projects use SLF4J as the logging framework (facade anyway).
> > Please
> > > > familiarize yourself with how to correctly log an Exception.  There
> is
> > no
> > > > need to log a thread name, a time stamp, a class name, or a stack
> > trace.
> > > > The logging framework will do that all for you.
> > > >
> > > > http://www.slf4j.org/faq.html#paramException
> > > >
> > > > Again, there is no need to 'stringify' an exception. For example, do
> > not
> > > > use this:
> > > >
> > > >
> > > >
> > >
> >
> https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/StringUtils.java#L86
> > > >
> > > >
> > > > If you do however want to dump a stack trace for debugging (or trace)
> > > > purposes, consider performing the following:
> > > >
> > > > if (LOG.isDebugEnabled()) {
> > > >   LOG.debug("Dump Thread Stack", new Exception("Thread Stack Trace
> (Not
> > > an
> > > > Error)"));
> > > > }
> > > >
> > > > Finally, I've seen it a couple of times in Apache project that
> enabling
> > > > debug-level logging causes the application to emit logs at other
> > levels,
> > > > for example:
> > > >
> > > > LOG.warn("Some error occurred: {}", e.getMessage());
> > > > if (LOG.isDebugEnabled()) {
> > > >   LOG. warn("Dump Warning Thread Stack", e);
> > > > }
> > > >
> > > > Please refrain from doing this.  The inner log statement should be at
> > > DEBUG
> > > > level to match the check.  Otherwise, when I enable DEBUG logging in
> > the
> > > > application, the expectation that I have is that I will have the
> exact
> > > > logging as the INFO level, but I will also have additional DEBUG
> > details
> > > as
> > > > well.  I am going to be using 'grep' to find DEBUG and I will miss
> this
> > > > additional logging.  I will then be peeved when I say "ah ha! It's a
> > WARN
> > > > log message, I don't need DEBUG enabled to get this logging when the
> > > issue
> > > > happens again!"... but then I restart the application and discover I
> do
> > > in
> > > > fact need DEBUG logging enabled.
> > > >
> > > > Finally, finally, do not pass server-generated stack traces to a
> client
> > > > application.  When a client dumps a stack trace, it is not always
> > trivial
> > > > to decide if the stack trace is in regards to the client or the
> server.
> > > > This can also be a security issue as it may hint to the client which
> > > > libraries and (based on line numbers) which versions of the libraries
> > are
> > > > being used.  If the server is going to generate an error in response
> > to a
> > > > client API call, the server should log the exception (right before
> > > > returning the response to the client) and it should only pass a
> helpful
> > > > error message to the client. The operator/administrator can look in
> the
> > > > server logs for the details.
> > > >
> > > > Thanks!
> > > >
> > >
> >
>

Reply via email to