aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/util.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-25 15:26:07 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-25 19:18:45 +0200
commit41633f9f73f402714dccb4a7f379441ee8272619 (patch)
treeec5ff0129865356552f340ed099d88e164bcb4ec /src/libutil/util.cc
parentc879a20850f2035cd87b1693da26cadf30affe11 (diff)
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.
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r--src/libutil/util.cc113
1 files changed, 3 insertions, 110 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 8ffa6973d..d73800905 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -356,8 +356,7 @@ void deletePath(const Path & path)
void deletePath(const Path & path, unsigned long long & bytesFreed)
{
- startNest(nest, lvlDebug,
- format("recursively deleting path ‘%1%’") % path);
+ Activity act(*logger, lvlDebug, format("recursively deleting path ‘%1%’") % path);
bytesFreed = 0;
_deletePath(path, bytesFreed);
}
@@ -456,113 +455,6 @@ void replaceSymlink(const Path & target, const Path & link)
}
-LogType logType = ltPretty;
-Verbosity verbosity = lvlInfo;
-
-static int nestingLevel = 0;
-
-
-Nest::Nest()
-{
- nest = false;
-}
-
-
-Nest::~Nest()
-{
- close();
-}
-
-
-static string escVerbosity(Verbosity level)
-{
- return std::to_string((int) level);
-}
-
-
-void Nest::open(Verbosity level, const FormatOrString & fs)
-{
- if (level <= verbosity) {
- if (logType == ltEscapes)
- std::cerr << "\033[" << escVerbosity(level) << "p"
- << fs.s << "\n";
- else
- printMsg_(level, fs);
- nest = true;
- nestingLevel++;
- }
-}
-
-
-void Nest::close()
-{
- if (nest) {
- nestingLevel--;
- if (logType == ltEscapes)
- std::cerr << "\033[q";
- nest = false;
- }
-}
-
-
-void printMsg_(Verbosity level, const FormatOrString & fs)
-{
- checkInterrupt();
- if (level > verbosity) return;
-
- string prefix;
- if (logType == ltPretty)
- for (int i = 0; i < nestingLevel; i++)
- prefix += "| ";
- else if (logType == ltEscapes && level != lvlInfo)
- prefix = "\033[" + escVerbosity(level) + "s";
- else if (logType == ltSystemd) {
- char c;
- switch (level) {
- case lvlError: c = '3'; break;
- case lvlInfo: c = '5'; break;
- case lvlTalkative: case lvlChatty: c = '6'; break;
- default: c = '7';
- }
- prefix = string("<") + c + ">";
- }
-
- string s = (format("%1%%2%\n") % prefix % fs.s).str();
- if (!isatty(STDERR_FILENO)) s = filterANSIEscapes(s);
- writeToStderr(s);
-}
-
-
-void warnOnce(bool & haveWarned, const FormatOrString & fs)
-{
- if (!haveWarned) {
- printMsg(lvlError, format("warning: %1%") % fs.s);
- haveWarned = true;
- }
-}
-
-
-void writeToStderr(const string & s)
-{
- try {
- if (_writeToStderr)
- _writeToStderr((const unsigned char *) s.data(), s.size());
- else
- writeFull(STDERR_FILENO, s);
- } catch (SysError & e) {
- /* Ignore failing writes to stderr if we're in an exception
- handler, otherwise throw an exception. We need to ignore
- write errors in exception handlers to ensure that cleanup
- code runs to completion if the other side of stderr has
- been closed unexpectedly. */
- if (!std::uncaught_exception()) throw;
- }
-}
-
-
-std::function<void(const unsigned char * buf, size_t count)> _writeToStderr;
-
-
void readFull(int fd, unsigned char * buf, size_t count)
{
while (count) {
@@ -953,7 +845,8 @@ static pid_t doFork(bool allowVfork, std::function<void()> fun)
pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
{
auto wrapper = [&]() {
- if (!options.allowVfork) _writeToStderr = 0;
+ if (!options.allowVfork)
+ logger = makeDefaultLogger();
try {
#if __linux__
if (options.dieWithParent && prctl(PR_SET_PDEATHSIG, SIGKILL) == -1)