Voting: std.logger

Martin Nowak via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 1 08:27:28 PDT 2014


On 08/01/2014 05:56 AM, Martin Nowak wrote:
> On 07/30/2014 01:09 AM, Robert burner Schadek wrote:
>>
>> I'm not sure how you except log(LogLevel.xxxx, "Hello world") to be
>> disabled at compile time if LogLevel.xxxx is a runtime value? Or do I
>> misunderstood you?
>>
>> you can choose to disable name based logging like trace("Hello trace")
>> at CT with the current release
>
> Here is a proof of concept to achieve this.
> http://dpaste.dzfl.pl/95fb6a4e086d
> It works by creating a different type for each loglevel.

Just checked tested this.

     static struct TestLogger
     {
         enum minLogLevel = LogLevel.error;
         void write(in LogEntry e) { _entries ~= e; }

         const(LogEntry)[] _entries;
     }

     void main()
     {
         TestLogger logger;
         logger.log(LogLevel.debug_, "foobar");
     }


The call logger.log(LogLevel.debug_) can be completely removed by the 
compiler. The delegates for the lazy parameters are still generated though.
Either fixing 
[`--gc-sections`](https://issues.dlang.org/show_bug.cgi?id=879) or 
adding [LTO](https://github.com/ldc-developers/ldc/issues/693) would help.
Also dmd (but not LDC) has a 
[bug](https://issues.dlang.org/show_bug.cgi?id=8615) where it still adds 
a few instructions to pass the delegate (even though the function is 
never called).

So I think it's an appropriate solution to the problem.
http://dpaste.dzfl.pl/95fb6a4e086d


More information about the Digitalmars-d mailing list