mirror of
https://github.com/NixOS/nix
synced 2025-06-27 08:31:16 +02:00
Improved logging abstraction
This also gets rid of --log-type, since the nested log type isn't useful in a multi-threaded situation, and nobody cares about the "pretty" log type.
This commit is contained in:
parent
c879a20850
commit
41633f9f73
29 changed files with 394 additions and 456 deletions
82
src/libutil/logging.hh
Normal file
82
src/libutil/logging.hh
Normal file
|
@ -0,0 +1,82 @@
|
|||
#pragma once
|
||||
|
||||
#include "types.hh"
|
||||
|
||||
namespace nix {
|
||||
|
||||
typedef enum {
|
||||
lvlError = 0,
|
||||
lvlInfo,
|
||||
lvlTalkative,
|
||||
lvlChatty,
|
||||
lvlDebug,
|
||||
lvlVomit
|
||||
} Verbosity;
|
||||
|
||||
class Activity;
|
||||
|
||||
class Logger
|
||||
{
|
||||
friend class Activity;
|
||||
|
||||
public:
|
||||
|
||||
virtual ~Logger() { }
|
||||
|
||||
virtual void log(Verbosity lvl, const FormatOrString & fs) = 0;
|
||||
|
||||
void log(const FormatOrString & fs)
|
||||
{
|
||||
log(lvlInfo, fs);
|
||||
}
|
||||
|
||||
virtual void setExpected(const std::string & label, uint64_t value = 1) { }
|
||||
virtual void setProgress(const std::string & label, uint64_t value = 1) { }
|
||||
virtual void incExpected(const std::string & label, uint64_t value = 1) { }
|
||||
virtual void incProgress(const std::string & label, uint64_t value = 1) { }
|
||||
|
||||
private:
|
||||
|
||||
virtual void startActivity(Activity & activity, Verbosity lvl, const FormatOrString & fs) = 0;
|
||||
|
||||
virtual void stopActivity(Activity & activity) = 0;
|
||||
|
||||
};
|
||||
|
||||
class Activity
|
||||
{
|
||||
public:
|
||||
Logger & logger;
|
||||
|
||||
Activity(Logger & logger, Verbosity lvl, const FormatOrString & fs)
|
||||
: logger(logger)
|
||||
{
|
||||
logger.startActivity(*this, lvl, fs);
|
||||
}
|
||||
|
||||
~Activity()
|
||||
{
|
||||
logger.stopActivity(*this);
|
||||
}
|
||||
};
|
||||
|
||||
extern Logger * logger;
|
||||
|
||||
Logger * makeDefaultLogger();
|
||||
|
||||
extern Verbosity verbosity; /* suppress msgs > this */
|
||||
|
||||
#define printMsg(level, f) \
|
||||
do { \
|
||||
if (level <= nix::verbosity) { \
|
||||
logger->log(level, (f)); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define debug(f) printMsg(lvlDebug, f)
|
||||
|
||||
void warnOnce(bool & haveWarned, const FormatOrString & fs);
|
||||
|
||||
void writeToStderr(const string & s);
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue