summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/log/log_level.h
blob: ccb12e4690b231c94277aa191bb8f0b373d20d25 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#pragma once

#include <library/cpp/logger/priority.h>

#include <util/generic/strbuf.h>
#include <util/generic/yexception.h>


namespace NYql {
namespace NLog {

enum class ELevel {
    FATAL = TLOG_EMERG,
    ERROR = TLOG_ERR,
    WARN = TLOG_WARNING,
    NOTICE = TLOG_NOTICE,
    INFO = TLOG_INFO,
    DEBUG = TLOG_DEBUG,
    TRACE = TLOG_RESOURCES,
};

struct ELevelHelpers {
    static constexpr bool Lte(ELevel l1, ELevel l2) {
        return ToInt(l1) <= ToInt(l2);
    }

    static constexpr ELogPriority ToLogPriority(ELevel level) {
        return static_cast<ELogPriority>(ToInt(level));
    }

    static ELevel FromLogPriority(ELogPriority priority) {
        return FromInt(static_cast<int>(priority));
    }

    static constexpr int ToInt(ELevel level) {
        return static_cast<int>(level);
    }

    static ELevel FromInt(int level) {
        switch (level) {
        case TLOG_EMERG:
        case TLOG_ALERT:
        case TLOG_CRIT: return ELevel::FATAL;

        case TLOG_ERR: return ELevel::ERROR;
        case TLOG_WARNING: return ELevel::WARN;

        case TLOG_NOTICE:
        case TLOG_INFO: return ELevel::INFO;

        case TLOG_DEBUG: return ELevel::DEBUG;
        case TLOG_RESOURCES: return ELevel::TRACE;

        default:
            return ELevel::INFO;
        }
    }

    static TStringBuf ToString(ELevel level) {
        // aligned 5-letters string
        switch (level) {
        case ELevel::FATAL: return TStringBuf("FATAL");
        case ELevel::ERROR: return TStringBuf("ERROR");
        case ELevel::WARN:  return TStringBuf("WARN ");
        case ELevel::NOTICE:return TStringBuf("NOTE ");
        case ELevel::INFO:  return TStringBuf("INFO ");
        case ELevel::DEBUG: return TStringBuf("DEBUG");
        case ELevel::TRACE: return TStringBuf("TRACE");
        }
        ythrow yexception() << "unknown log level: " << ToInt(level);
    }

    static ELevel FromString(TStringBuf str) {
        // aligned 5-letters string
        if (str == TStringBuf("FATAL")) return ELevel::FATAL;
        if (str == TStringBuf("ERROR")) return ELevel::ERROR;
        if (str == TStringBuf("WARN ")) return ELevel::WARN;
        if (str == TStringBuf("NOTE ")) return ELevel::NOTICE;
        if (str == TStringBuf("INFO ")) return ELevel::INFO;
        if (str == TStringBuf("DEBUG")) return ELevel::DEBUG;
        if (str == TStringBuf("TRACE")) return ELevel::TRACE;
        ythrow yexception() << "unknown log level: " << str;
    }

    template <typename TFunctor>
    static void ForEach(TFunctor&& f) {
        static const int minValue = ToInt(ELevel::FATAL);
        static const int maxValue = ToInt(ELevel::TRACE);

        for (int l = minValue; l <= maxValue; l++) {
            f(FromInt(l));
        }
    }
};


} // namspace NLog
} // namspace NYql