On Tue, 31 May 2011 12:28:12 -0400, Jose Armando Garcia <jsan...@gmail.com> wrote:

On Tue, May 31, 2011 at 11:28 AM, Steven Schveighoffer
<schvei...@yahoo.com> wrote:
On Sun, 29 May 2011 16:57:52 -0400, Brad Roberts <bra...@puremagic.com>
wrote:

On 5/29/2011 8:44 AM, Andrei Alexandrescu wrote:

1. The fatal log should never be stripped. This is because execution of
code after using fatal depends on compile-time
flags, which is unacceptable. Logging to fatal should terminate the
application regardless of circumstances. Otherwise
people would need to write things like:

fatal("blah");
assert(0, "Execution cannot continue even though logging is stripped");

This is needless and bug-prone. Fatal is fatal.

Fatal can be with context. Let's say you have one thread that hits a fatal error, and another thread which is finishing out a DB transaction. Since logging the fatal error will kill the whole application, I now would have to write some sync function that all threads have to periodically call to make sure I don't kill some perfectly valid process that's unrelated to the fatal
error.  This seems like way more work to me than assert(0).

For some applications fatal makes sense for others critical is better
and for others error is better. Use the one that fits your application
or library. Having said that you can replace the assert(false) by
using a fatal handler the only requirement on this handler is that it
doesn't return or throw; otherwise std.log will assert(false).

Again, this sounds way too complicated for what it's giving you (avoiding having to forcibly kill your application if that's what you desire). If I had to choose from your options, I'd use neither critical nor fatal. I'd probably just stick with the higher levels, and start putting my own levels in as strings to avoid what I'd consider to be "buggy" behavior...

From my own experience, I almost never *never* use a forced kill. A graceful shutdown works much better. Remember that a 'fatal' error is not so much a "this program can't continue because it's not sane," but a "this program cannot continue because something is misconfigured, etc." This does not warrant raw destruction.

A better option is to make the default "handler" assert(0), and let you override that when you set a new one. This should not be too difficult (only need assert(0) in one place).

Flexibility in this regard is way more valuable than consistency between applications. I don't see the reasoning for the hard requirements. Is it simply because it's this way in glog?

At one time I used a log framework that included this behavior. After a
couple years, I came to greatly regret it.
Fatalness down in libraries became overused, particularly in layers that
were libraries.  In some ways it was abuse of
fatal for things that shouldn't have been, but it's mere existence
encouraged it's use.

I really don't think it's the log libraries job to implement app
termination behavior.

Would it be possible to provide a "non-action" logger implementation? It
seems that the logger instantiation is customizable on the call to
initializeLogging. I'd say that should be the default as well (if you want
certain actions, you can select the more proactive one).

This is not possible. Can you please motivate you requirement? The
intent is that some of the semantic of fatal, critical, error,
warning, info and verbose is set by the frontend to std.log and it
doesn't change when the user changes the backend. I want to give the
user some kind of guarantee on how the library behaves.

Sure, the requirement is that the logger never ever alters my program's behavior without my permission. I'm using the logger to log data, not to create code paths. If I want a function that logs a message and then halts the application, I can write one of those (you can even include it as part of std.log!). It's like having fopen halt your application if it can't open a file.

Essentially I think it is an egregious mistake to tie whole-application functionality to logging. I don't care of the convenience, a logger is for logging, nothing else. For sure, if std.log implements mandatory halting, my belief is another competitor log library will certainly get the lion's share of users, even if it's third party.

-Steve

Reply via email to