i don't think there is a safe way to do this with a macro. you are taking a statement and make it look like an expression, yet it really isn't. there will always be cases where this can break.
you could do something like:
#define do_log(X, Y...) { if ( !(< DBG, TME >)[T] ) low_log(X, Y); }
then you would get an error if you place a ; after do_log() before an else (unless you have another block of {} around it.
an error is better than a random hard to see unusual behaviour.
i'd use a regular function instead of a macro though.
greetings, martin.