summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/log/log_level.h
blob: 5471e411d528e9e268ad9ead2edd5d649db6adbd (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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));
        }
    }
};

} // namespace NLog
} // namespace NYql