Creare log in C++

Mattepuffo's logo
Creare log in C++

Creare log in C++

In questo articolo vi propongo una piccola classe per creare log nelle nostre applicazioni C++.

Ovviamente è una cosa basica, e non copre tutte le esigenze di un'applicazione complessa.

Ma potrebbe essere utile per cose piccole e come punto di partenza.

Vi metto tutto il codice insieme per comodità:

#include <fstream>
#include <iostream>
#include <ctime>
#include <mutex>
#include <string>

class Logger
{
    std::ofstream file;
    std::mutex mtx;

public:
    enum Level
    {
        DEBUG,
        INFO,
        WARNING,
        ERROR
    };

    Logger(const std::string &filename)
    {
        file.open(filename, std::ios::app);
        if (!file.is_open())
        {
            std::cerr << "Errore: impossibile aprire il file di log!" << std::endl;
        }
    }

    ~Logger()
    {
        if (file.is_open())
        {
            file.close();
        }
    }

    void log(Level level, const std::string &msg)
    {
        std::lock_guard<std::mutex> lock(mtx);

        time_t now = time(nullptr);
        char timestamp[20];
        strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", localtime(&now));

        std::string levelStr[] = {"DEBUG", "INFO", "WARN", "ERROR"};

        std::string logLine = "[" + std::string(timestamp) + "] [" + levelStr[level] + "] " + msg;

        // Scrivi su file
        if (file.is_open())
        {
            file << logLine << std::endl;
            file.flush();
        }

        // Scrivi anche su console
        std::cout << logLine << std::endl;
    }

    // Metodi helper
    void debug(const std::string &msg) { log(DEBUG, msg); }
    void info(const std::string &msg) { log(INFO, msg); }
    void warning(const std::string &msg) { log(WARNING, msg); }
    void error(const std::string &msg) { log(ERROR, msg); }
};

int main()
{
    // Crea il logger specificando il file di output
    Logger logger("test.log");

    logger.info("Applicazione avviata");

    // Simulazione di operazioni
    logger.debug("Inizializzazione delle risorse...");

    int utenti_connessi = 42;
    logger.info("Utenti connessi: " + std::to_string(utenti_connessi));

    // Simulazione di un warning
    logger.warning("Memoria disponibile bassa: 15%");

    // Simulazione di elaborazione
    for (int i = 1; i <= 3; i++)
    {
        logger.debug("Elaborazione item " + std::to_string(i) + "/3");
    }

    // Simulazione di un errore
    bool operazione_fallita = true;
    if (operazione_fallita)
    {
        logger.error("Impossibile connettersi al database!");
    }

    logger.info("Applicazione terminata");

    return 0;
}

Una prima che potreste aggiungere è, ad esempio, la rotazione dei file di log.

Enjoy!


Condividi

Commentami!