Voting: std.logger
via Digitalmars-d
digitalmars-d at puremagic.com
Wed Sep 3 06:13:29 PDT 2014
On Wednesday, 3 September 2014 at 11:39:59 UTC, Kevin Lamonte
wrote:
> I've written my own ideas about logging vs tracing over at
> https://github.com/klamonte/log4d/docs/philosophy.md
Nice writeup! It is kind of interesting that there are so many
different takes on a mundane task such as logging, monitoring,
debug-tracing etc. Reminds me of reflections on how many types of
NULL you need to cover all the different semantics that NULL can
express (was it 5 or 6?).
> It sounds like what you would like is a trace function that
> doesn't feature a format string at all, but formatting would
> instead be applied at I/O time by a Logger subclass.
Yes, either that or no formatting at all. If all formatting
strings are literals and resolve at compile time then you can
extract them from the source and create a big compile time map
that convert them into numeric values at compile time and convert
the types into numeric values as well. If the API supports full
compile time reflection that should be a possibility.
High performance logging should just be a series of MOV
instructions or SSE equivalents that completes in ~8-40 cycles
for a circular buffer with 2^N size. With increasing availability
of memory on cloud servers this becomes more and more attractive
IMO (you can log a lot in 50MB)
It important is that you exploit the fact that the values are
already in registers because you usually log values that have
recently been computed and that you spend a minimal amount of
execution time on registering them, perhaps even writing directly
to full memory cache lines to avoid cache pollution (using
special SSE commands).
If you accept slightly out of sync logging then you can have
thread local buffers and on x86 use the command RDTSC which gives
you a (good enough) timer value so you can merge the buffers from
threads later. It takes roughly 20-30 cycles which I presume is
better than CAS instructions, or you can just write directly to a
global counter without CAS and accept that it jitters?
I personally don't care about enter/exit so much. I care about:
1. tracking the state of the system configuration at the point of
failure
2. the paths of execution before the incident
3. the events that led up to it (in order to reproduce the
failure).
> This could also be split into traceFnEnter, traceFnExitSuccess,
> and traceFnExitFailure with LogEntry.args set to indicate which
> one (">", "<", "!<" for example) and a mixin provided so that
> client code could get it all in a one-liner.
Sounds like a candidate for an attribute, just prefix a function
or function call with @trace(level)?
More information about the Digitalmars-d
mailing list