aboutsummaryrefslogtreecommitdiff
path: root/src/utils/logger.h
blob: 2896c7e5698897bf1be76a80dac093e7ad462431 (plain)
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
#ifndef SRDWM_LOGGER_H
#define SRDWM_LOGGER_H

#include <string>
#include <sstream>
#include <memory>

// Log levels
enum class LogLevel {
    DEBUG,
    INFO,
    WARNING,
    ERROR,
    FATAL
};

// Logger class
class Logger {
public:
    Logger();
    ~Logger();
    
    // Set log level
    void set_level(LogLevel level);
    
    // Logging methods
    void debug(const std::string& message);
    void info(const std::string& message);
    void warning(const std::string& message);
    void error(const std::string& message);
    void fatal(const std::string& message);
    
    // Log with level
    void log(LogLevel level, const std::string& message);
    
    // Set output file
    void set_output_file(const std::string& filename);
    
    // Enable/disable console output
    void enable_console(bool enable);
    
    // Enable/disable file output
    void enable_file(bool enable);

private:
    LogLevel current_level;
    bool console_enabled;
    bool file_enabled;
    std::string output_filename;
    std::unique_ptr<std::ostream> file_stream;
    
    std::string level_to_string(LogLevel level);
    std::string get_timestamp();
    void write_log(LogLevel level, const std::string& message);
};

// Global logger instance
extern Logger g_logger;

// Convenience macros
#define LOG_DEBUG(msg) g_logger.debug(msg)
#define LOG_INFO(msg) g_logger.info(msg)
#define LOG_WARNING(msg) g_logger.warning(msg)
#define LOG_ERROR(msg) g_logger.error(msg)
#define LOG_FATAL(msg) g_logger.fatal(msg)

// Stream-based logging
class LogStream {
public:
    LogStream(Logger& logger, LogLevel level);
    ~LogStream();
    
    template<typename T>
    LogStream& operator<<(const T& value) {
        stream << value;
        return *this;
    }

private:
    Logger& logger;
    LogLevel level;
    std::ostringstream stream;
};

// Stream logging macros
#define LOG_STREAM_DEBUG LogStream(g_logger, LogLevel::DEBUG)
#define LOG_STREAM_INFO LogStream(g_logger, LogLevel::INFO)
#define LOG_STREAM_WARNING LogStream(g_logger, LogLevel::WARNING)
#define LOG_STREAM_ERROR LogStream(g_logger, LogLevel::ERROR)
#define LOG_STREAM_FATAL LogStream(g_logger, LogLevel::FATAL)

#endif // SRDWM_LOGGER_H