On 05/29/2011 04:52 PM, Vincent wrote:
Hello, Andrei! Very appreciate you spent time on my work.
I agree with some your critique, sure it's just a question of
improvements. My main question is acceptance of my log library as a
whole conception, since it's simple and 10 from 10 programmers can
understand its sources (I keep it as very serious goal).

Why? 10 out of 10 would be more interested in using the library effectively instead of reading its source. Clearly keeping the source readable is desirable, but not an overriding goal. It's probably the last thing you care about after having taken care of everything.

Let's discuss doubtful points...

Verbosity is not very often used indeed but I'd guess many people got
used to it because it's present in most libraries.

Habit is not the rule. You must remember those days when every DOS
editor show time in menu bar. WHY? Just because everybody did it. I see
nothing bad to loose this 'verbosity' as archaic feature.
As I said before, 'special demands' is the pain of 'special programmers'
- if they REALLY cannot live w/o 'verbosity', they can add it in 3 LOC.

You mentioned you don't care about verbosity levels. I added that I haven't found a lot of use for them either. Next thing you know, you're presupposing your own assumption. Isn't the data set a tad small to draw conclusions from?

* The library doesn't take care of capturing the origin of the log
(file/module/line) so the user must pass them manually.

I've read posts related __LINE__s in log and don't see any reason in
this feature. Why?
1. It's not direct task of 'logging'. Log doesn't care about your
lines/files just because you're too negligent to control what and where
you log - its task is just assemble together runtime info.
2. Nobody prevent you from doing it! Just make 'mixin' with __FILE__ and
use.
3. In my practice I didn't see so low-level approach for debugging -
well organised log shows enough, why people care about number of code
line in editor?? Funny, heh...
4. Logging is not only "We have a problem in line 10!" - it's "trace of
life" for our program.

Without automated headers including location of the log line and date/time, one can't even call that a logging library. It's an text streaming facility.

* The library requires version(logging) to control enabling.
Essentially the client would need to prefix _all_ logging lines

Agree completely. But something says to me that it's just a my little
knowledge of D (and it's true). Sure there is some feature to make log
calls 'invisible' without 'version' prefix - I just used feature I sure
about. May be mixins will help? This is the place where I need help of
community.

The help can be readily absorbed from reading the existing proposal.

* The library always evaluates arguments, even when logging is
dynamically disabled.

First, let's remember Knuth's "Premature Optimization" warning - say
"it's slow" only when it's really slow down your program.

Evaluating arguments always vs. not at all is a matter of principles.

Second, remember use case of this "runtime switch": "ALL logging is
enabled (read "everywhere it's slow"), but at this place it's disabled
(and who cares how slow it is?)".

It is very important that the program is as fast as it can when logging is disabled. I don't understand how one could argue sensibly otherwise.

Third, if you use log, you NEED this info, despite how fast it was
calculated. And even if you jump over with 'lazy' arguments, they HAVE
to be calculated - you wait 'em anyway! So... what a benefit you have
from laziness?

With lazy evaluation you can arrange that complex expressions inside the log calls are not evaluated.

And hell, if you're good programmer, you'll never write critical section
like
log("a");
log("b");
...rather you accumulate log info and output it at once.
I agree with usefullness of 'lazy' stuff, but not in this case.

Sometimes you do need to insert log expressions in relatively critical places for debugging purposes.

* The library does not define a notion of a severity hierarchy

If you look at use cases of this 'severity', there is no 'hierarchy'
(look at usage of my library) - it's again "habits" of 70-th. Just
obvious example from real life:
I log all 'info' messages about client actions. But somewhere I get
database exception - my fault, logged as 'critical'. Together with two
levels above I have 'warning' level about problems like 'this person has
no surname'. Question is: "Why I must dig in 'warning' trash, when I
just need info what client did and which critical problem happen?". As
you see, 'hierarchy' is just "flat" view on problem - there is
independed severities and _combination_ of 'em.
Again, no apocalypse happen - who need this feature, that must spent
time on it.

Your example describes a trivial matter. Often times, the trace leading to a critical problem is indicative of the issue in more complicated applications.

Arguably defining a hierarchy could be considered outside the scope of
a "core" logging library, but that means more work for the casual user
of the library to achieve a common task.

Exactly. You cannot include in simple 'string assembler' all
functionality (esp. legacy point of view - time is changed!). Simple
requirements must lead to simple usage - if you don't use 'verbosity',
why you should pass parameters in every log call?

Who does? Did you skim the existing proposal at all?

I believe something close to Jose's library (after community feedback)
will become the standard library for logging, so we should at best we
consolidate efforts behind it.

What if I don't believe? :) We'll spent time on functions, used by 1% of
'old shoes' and give a bad example for next generations. I don't pretend
I wrote the best library ever, but I kept on rule 'implement only
necessary stuff' and I have a reason for every decision.
Well, I don't want to press anybody, but before you completely give up
my implementation I wanna be smashed with serious arguments how bad my
design is. :) (may be it'll be good lesson for another designs!)

Good luck for all community!

Same here, and welcome. First, this seems to be the third time you are referring negatively about age. That is never in good taste, and can at best be tolerated if it comes from a position of exceptional achievement.

Second, if you're looking for definitive arguments for or against your design, you're unlikely to find them. Design is a subjective endeavor, so you can always make a counter-argument to pretty much any argument (as you just did).

Third, I find it tenuous to agree that you "implemented only the necessary stuff" and that you "have a reason for every decision". If you cast a candid eye over your design, you'll notice that it has virtually nothing to do with logging aside from using the "log" word here and there. It's barely a design at all as it's just a barebones streaming text out glue that assembles an external string template engine with an ad-hoc streaming interface containing only the Write primitive. So unless you set out to implement nothing but simple streaming, you didn't implement only the necessary stuff; and if you have a reason for every decision, then by necessity one motivating reason was to stay away from anything specific to logging.



Andrei

Reply via email to