logError, logWarning; Logger functions; switch to Verbosity enum

This commit is contained in:
Ben Burdette 2020-04-17 15:07:44 -06:00
parent 12814806ef
commit 3d5b1032a1
7 changed files with 128 additions and 66 deletions

View file

@ -1,4 +1,4 @@
#include "error.hh" #include "logging.hh"
#include "nixexpr.hh" #include "nixexpr.hh"
#include <iostream> #include <iostream>
@ -8,24 +8,25 @@ int main()
{ {
using namespace nix; using namespace nix;
std::unique_ptr<Logger> logger(makeDefaultLogger());
verbosity = lvlError;
// In each program where errors occur, this has to be set. // In each program where errors occur, this has to be set.
ErrorInfo::programName = std::optional("error-demo"); ErrorInfo::programName = std::optional("error-demo");
// Error in a program; no hint and no nix code. // Error in a program; no hint and no nix code.
printErrorInfo( logError(
ErrorInfo { .level = elError, ErrorInfo { .name = "name",
.name = "name",
.description = "error description", .description = "error description",
}); });
// Warning with name, description, and hint. // Warning with name, description, and hint.
// The hintfmt function makes all the substituted text yellow. // The hintfmt function makes all the substituted text yellow.
printErrorInfo( logWarning(
ErrorInfo { .level = elWarning, ErrorInfo { .name = "name",
.name = "name",
.description = "error description", .description = "error description",
.hint = std::optional( .hint = hintfmt("there was a %1%", "warning"),
hintfmt("there was a %1%", "warning")),
}); });
@ -34,32 +35,32 @@ int main()
SymbolTable testTable; SymbolTable testTable;
auto problem_file = testTable.create("myfile.nix"); auto problem_file = testTable.create("myfile.nix");
printErrorInfo( logWarning(
ErrorInfo{ ErrorInfo { .name = "warning name",
.level = elWarning, .description = "warning description",
.name = "warning name", .hint = hintfmt("this hint has %1% templated %2%!!",
.description = "warning description", "yellow",
.hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"), "values"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13), .errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = std::nullopt, .prevLineOfCode = std::nullopt,
.errLineOfCode = "this is the problem line of code", .errLineOfCode = "this is the problem line of code",
.nextLineOfCode = std::nullopt .nextLineOfCode = std::nullopt
}}); }});
// Error with previous and next lines of code. // Error with previous and next lines of code.
printErrorInfo( logError(
ErrorInfo{ ErrorInfo { .name = "error name",
.level = elError, .description = "error description",
.name = "error name", .hint = hintfmt("this hint has %1% templated %2%!!",
.description = "error description", "yellow",
.hint = hintfmt("this hint has %1% templated %2%!!", "yellow", "values"), "values"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13), .errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = std::optional("previous line of code"), .prevLineOfCode = std::optional("previous line of code"),
.errLineOfCode = "this is the problem line of code", .errLineOfCode = "this is the problem line of code",
.nextLineOfCode = std::optional("next line of code"), .nextLineOfCode = std::optional("next line of code"),
}}); }});
return 0; return 0;

View file

@ -73,6 +73,10 @@ struct TunnelLogger : public Logger
enqueueMsg(*buf.s); enqueueMsg(*buf.s);
} }
void logEI(const ErrorInfo & ei) override
{
}
/* startWork() means that we're starting an operation for which we /* startWork() means that we're starting an operation for which we
want to send out stderr to the client. */ want to send out stderr to the client. */
void startWork() void startWork()

View file

@ -2,6 +2,7 @@
#include <iostream> #include <iostream>
#include <optional> #include <optional>
#include "serialise.hh"
namespace nix namespace nix
{ {
@ -66,25 +67,45 @@ void printCodeLines(const string &prefix, const NixCode &nixCode)
} }
} }
void printErrorInfo(const ErrorInfo &einfo) std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo)
{ {
int errwidth = 80; int errwidth = 80;
string prefix = " "; string prefix = " ";
string levelString; string levelString;
switch (einfo.level) { switch (einfo.level) {
case ErrLevel::elError: { case Verbosity::lvlError: {
levelString = ANSI_RED; levelString = ANSI_RED;
levelString += "error:"; levelString += "error:";
levelString += ANSI_NORMAL; levelString += ANSI_NORMAL;
break; break;
} }
case ErrLevel::elWarning: { case Verbosity::lvlWarn: {
levelString = ANSI_YELLOW; levelString = ANSI_YELLOW;
levelString += "warning:"; levelString += "warning:";
levelString += ANSI_NORMAL; levelString += ANSI_NORMAL;
break; break;
} }
case Verbosity::lvlInfo: {
levelString = ANSI_YELLOW;
levelString += "info:";
levelString += ANSI_NORMAL;
break;
}
case Verbosity::lvlTalkative:
case Verbosity::lvlChatty:
case Verbosity::lvlVomit: {
levelString = ANSI_GREEN;
levelString += "info:";
levelString += ANSI_NORMAL;
break;
}
case Verbosity::lvlDebug: {
levelString = ANSI_YELLOW;
levelString += "debug:";
levelString += ANSI_NORMAL;
break;
}
default: { default: {
levelString = fmt("invalid error level: %1%", einfo.level); levelString = fmt("invalid error level: %1%", einfo.level);
break; break;
@ -99,7 +120,7 @@ void printErrorInfo(const ErrorInfo &einfo)
dashes.append("-"); dashes.append("-");
// divider. // divider.
std::cout << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL, out << fmt("%1%%2%" ANSI_BLUE " %3% %4% %5% %6%" ANSI_NORMAL,
prefix, prefix,
levelString, levelString,
"---", "---",
@ -115,32 +136,33 @@ void printErrorInfo(const ErrorInfo &einfo)
? string(" ") + showErrPos(einfo.nixCode->errPos) ? string(" ") + showErrPos(einfo.nixCode->errPos)
: ""; : "";
std::cout << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL, out << fmt("%1%in file: " ANSI_BLUE "%2%%3%" ANSI_NORMAL,
prefix, prefix,
einfo.nixCode->errPos.nixFile, einfo.nixCode->errPos.nixFile,
eline) << std::endl; eline) << std::endl;
std::cout << prefix << std::endl; out << prefix << std::endl;
} else { } else {
std::cout << fmt("%1%from command line argument", prefix) << std::endl; out << fmt("%1%from command line argument", prefix) << std::endl;
std::cout << prefix << std::endl; out << prefix << std::endl;
} }
} }
// description // description
std::cout << prefix << einfo.description << std::endl; out << prefix << einfo.description << std::endl;
std::cout << prefix << std::endl; out << prefix << std::endl;
// lines of code. // lines of code.
if (einfo.nixCode->errLineOfCode != "") { if (einfo.nixCode->errLineOfCode != "") {
printCodeLines(prefix, *einfo.nixCode); printCodeLines(prefix, *einfo.nixCode);
std::cout << prefix << std::endl; out << prefix << std::endl;
} }
// hint // hint
if (einfo.hint.has_value()) { if (einfo.hint.has_value()) {
std::cout << prefix << *einfo.hint << std::endl; out << prefix << *einfo.hint << std::endl;
std::cout << prefix << std::endl; out << prefix << std::endl;
} }
}
return out;
}
} }

View file

@ -11,9 +11,14 @@ namespace nix
{ {
typedef enum { typedef enum {
elWarning, lvlError = 0,
elError lvlWarn,
} ErrLevel; lvlInfo,
lvlTalkative,
lvlChatty,
lvlDebug,
lvlVomit
} Verbosity;
struct ErrPos struct ErrPos
{ {
@ -101,7 +106,7 @@ inline hintformat hintfmt(const std::string & fs, const Args & ... args)
// ErrorInfo. // ErrorInfo.
struct ErrorInfo struct ErrorInfo
{ {
ErrLevel level; Verbosity level;
string name; string name;
string description; string description;
std::optional<hintformat> hint; std::optional<hintformat> hint;
@ -110,11 +115,7 @@ struct ErrorInfo
static std::optional<string> programName; static std::optional<string> programName;
}; };
// -------------------------------------------------------- std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo);
// error printing
// just to cout for now.
void printErrorInfo(const ErrorInfo &einfo);
} }

View file

@ -3,6 +3,7 @@
#include <atomic> #include <atomic>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <sstream>
namespace nix { namespace nix {
@ -57,6 +58,14 @@ public:
writeToStderr(prefix + filterANSIEscapes(fs.s, !tty) + "\n"); writeToStderr(prefix + filterANSIEscapes(fs.s, !tty) + "\n");
} }
void logEI(const ErrorInfo & ei) override
{
std::stringstream oss;
oss << ei;
log(ei.level, oss.str());
}
void startActivity(ActivityId act, Verbosity lvl, ActivityType type, void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
const std::string & s, const Fields & fields, ActivityId parent) const std::string & s, const Fields & fields, ActivityId parent)
override override
@ -135,6 +144,15 @@ struct JSONLogger : Logger
write(json); write(json);
} }
void logEI(const ErrorInfo & ei) override
{
// nlohmann::json json;
// json["action"] = "msg";
// json["level"] = lvl;
// json["msg"] = fs.s;
// write(json);
}
void startActivity(ActivityId act, Verbosity lvl, ActivityType type, void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
const std::string & s, const Fields & fields, ActivityId parent) override const std::string & s, const Fields & fields, ActivityId parent) override
{ {

View file

@ -1,19 +1,10 @@
#pragma once #pragma once
#include "types.hh" #include "types.hh"
#include "error.hh"
namespace nix { namespace nix {
typedef enum {
lvlError = 0,
lvlWarn,
lvlInfo,
lvlTalkative,
lvlChatty,
lvlDebug,
lvlVomit
} Verbosity;
typedef enum { typedef enum {
actUnknown = 0, actUnknown = 0,
actCopyPath = 100, actCopyPath = 100,
@ -70,6 +61,13 @@ public:
log(lvlInfo, fs); log(lvlInfo, fs);
} }
virtual void logEI(const ErrorInfo &ei) = 0;
void logEI(Verbosity lvl, ErrorInfo ei) {
ei.level = lvl;
logEI(ei);
}
virtual void warn(const std::string & msg); virtual void warn(const std::string & msg);
virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
@ -157,6 +155,18 @@ extern Verbosity verbosity; /* suppress msgs > this */
#define debug(args...) printMsg(lvlDebug, args) #define debug(args...) printMsg(lvlDebug, args)
#define vomit(args...) printMsg(lvlVomit, args) #define vomit(args...) printMsg(lvlVomit, args)
#define logErrorInfo(level, errorInfo...) \
do { \
if (level <= nix::verbosity) { \
logger->logEI(level, errorInfo); \
} \
} while (0)
#define logError(errorInfo...) logErrorInfo(lvlError, errorInfo)
#define logWarning(errorInfo...) logErrorInfo(lvlWarn, errorInfo)
template<typename... Args> template<typename... Args>
inline void warn(const std::string & fs, const Args & ... args) inline void warn(const std::string & fs, const Args & ... args)
{ {

View file

@ -124,6 +124,12 @@ public:
log(*state, lvl, fs.s); log(*state, lvl, fs.s);
} }
void logEI(const ErrorInfo &ei) override
{
auto state(state_.lock());
// log(*state, lvl, ei.as_str());
}
void log(State & state, Verbosity lvl, const std::string & s) void log(State & state, Verbosity lvl, const std::string & s)
{ {
if (state.active) { if (state.active) {