Fluent interface for Logger
i do not think this is really a good idea (sorry to say that)...

why is is not a good idea? it's breaking the concept of segregaton of concerns:


a Logger is responsible for logging
a Profiler is responsible for measuring execution time
a Logger is NOT responsible for keeping track of items (who is responsible for cleaning these entries?)


another issue i see is that you create a new logger whenever you want to write something into you log, i don't see any reason for that... 

what would i suggest? 

create a timesheet

public class Timesheet{

   private final Map&lt;TimeStamp, KeyValue kv&gt; entries;
   private final Logger logger;

    public Timesheet(Logger logger){
        this.logger = logger
        entries= ... 
    }

    public Timesheet kv(Object key, Object value) {
        TimeStamp timestamp = new TimeStamp();
        entries.put(timestamp , new KeyValue(key, value));
        log.debug("adding key/value {}/{} at {}", key, value, timestamp );
        return this;
    }

    public Timesheet msg(Object msg) {
        logger.debug(msg);
        return this;
    }

    public Timesheet elapsed() {
        logger.debug("time elapsed {}", calculateTimeElapsed());
        return this;
    }

}


not all is implemented here, it should just girve you an idea of how you could do it...

Timesheet timesheet = new Timesheet(LoggerFactory.getLogger("jsonLogger")); //now availible for all classes
timesheet.msg("hello");
timesheet.kv("foo", "bar");
Thread.sleep(1234);
timesheet.elapsed();


some final words...

i think it is not a good idea of using KeyValue pairs - if you know what kind of entries these are, give them a proper name!

i think if you would have choosen a more compliant name (Log is really confusing) your idea would not have been so bad...