Base functionality similar to log4j (levels/severities; allow filters and emitters to be hooked in).
Automatically capture timestamp (when log call is made, not when item is emitted), thread, function, file, and line.
Optionally, possibly with a mark, support capturing function args, local variables, and program stats like those offered by "top" in a log call, without having to manually add each of them as args to the log call.
Support localization?
Handle thousands of logged events per sec from multiple threads.
Specify criteria at compile-time and at run-time that turns logging on or off in particular scopes (block, function, class, module, package, thread) in powerful and flexible ways, without altering actual lines of code that do the logging. For example, I'd like to say: enable logging in all classes that are part of the call graph for function X, AND enable logging if severity is greater than Y, AND enable logging for all functions that are tagged with mark Z.
Distinguish between logging for the developer (tracing) and logging for the user.
Hide protected data such as passwords. (use a mark on variables/params to mask in logs)
Provide a short-circuit so that a log call becomes a true no-op (not even invoking the cost of marshalling its args) if it's disabled.
Provide another short-circuit so a log call minimizes its expense if it will not be emitted.
Provide a circular queue so a very verbose capture of recent log events can be retains for a limited time (e.g., 30 sec), so that on abend, a crash handler can increase the log level dramatically.
Allow a message queue interface so logs can be subscribed to, and filtered externally in real-time.
Allow compression, so repetitive strings can be collapsed.
Provide an event category or event id (possibly just the address of its string literal) as an arg to each log call, so that thousands of calls to log that all originate in the same place in source can all be seen as "the same" in some way, and so it is possible to find all events with the same origin, even if their rendered string differs due to argument expansion. This also allows compression of the log.
Support logrotate behaviors?
Provide a plugin for syslog on *nix and for the Windows Event Log?
Provide a circuit breaker so highly repetitive logged items get automatically aggregated?