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!
c++ log
Commentami!