Domanda

Mi sono chiesto: qual è lo scopo di intasare?Per quanto ne so, clog è uguale a cerr ma con buffering quindi è più efficiente.Di solito stderr è uguale a stdout, quindi clog è uguale a cout.Questo mi sembra piuttosto noioso, quindi immagino di averlo frainteso.Se ho messaggi di log in uscita nello stesso posto in cui ho messaggi di errore in uscita (forse qualcosa in /var/log/messages), allora probabilmente non sto scrivendo troppo (quindi non c'è molto da perdere usando non -cerr bufferizzato).Nella mia esperienza, voglio che i miei messaggi di registro siano aggiornati (non memorizzati nel buffer) in modo da poter aiutare a trovare un arresto anomalo (quindi non voglio utilizzare il clog bufferizzato).A quanto pare dovrei sempre usare cerr.

Mi piacerebbe poter reindirizzare clog all'interno del mio programma.Sarebbe utile reindirizzare cerr in modo che quando chiamo una routine di libreria posso controllare dove vanno cerr e clog.Alcuni compilatori possono supportarlo?Ho appena controllato DJGPP e stdout è definito come l'indirizzo di una struttura FILE, quindi è illegale fare qualcosa come "stdout = freopen(...)".

  • È possibile reindirizzare clog, cerr, cout, stdin, stdout e/o stderr?
  • L'unica differenza tra clog e cerr è il buffering?
  • Come dovrei implementare (o trovare) una struttura di registrazione più solida (link per favore)?
È stato utile?

Soluzione

È possibile reindirizzare clog, cerr, cout, stdin, stdout e/o stderr?

SÌ.Vuoi il rdbuf funzione.

ofstream ofs("logfile");
cout.rdbuf(ofs.rdbuf());
cout << "Goes to file." << endl;

L'unica differenza tra clog e cerr è il buffering?

Per quanto ne so, sì.

Altri suggerimenti

Se ti trovi in ​​un ambiente di shell Posix (sto davvero pensando a bash), puoi reindirizzare qualsiasi descrittore di file a qualsiasi altro descrittore di file, per così dire, per reindirizzare: puoi solo:

$ myprogram 2>&5 

per reindirizzare stderr al file rappresentato da fd=5.

Modificare:ripensandoci, mi piace di più la risposta di @ Konrad Rudolph sul reindirizzamento.rdbuf() è un modo più coerente e portabile per farlo.

Per quanto riguarda la registrazione, beh... inizio con la libreria Boost per tutto ciò che riguarda C++ che non è nella libreria std.Ecco: Aumenta la registrazione v2

Modificare:La registrazione potenziata è non parte delle biblioteche Boost;è stato rivisto, ma non accettato.

Modificare:Due anni dopo, nel maggio 2010, Boost accettò una libreria di registrazione, ora chiamata Boost.Log.

Naturalmente ci sono delle alternative:

  • Log4Cpp (un'API in stile log4j per C++)
  • Log4Cxx (API in stile log4j sponsorizzata da Apache)
  • Pantheios (defunto?l'ultima volta che ho provato non sono riuscito a farlo compilare su un compilatore recente)
  • GLog di Google (cappello @SuperElectric)

C'è anche il registro eventi di Windows.

E un paio di articoli che potrebbero esserti utili:

Registratore di base

#define myerr(e) {CriticalSectionLocker crit; std::cerr << e << std::endl;}

Usato come myerr("ERR: " << message); O myerr("WARN: " << message << code << etc);

È molto efficace

Quindi fa:

./programname.exe 2> ./stderr.log
perl parsestderr.pl stderr.log

o semplicemente analizzare stderr.log manualmente

Ammetto che non è per estremamente codice critico per le prestazioni.Ma chi lo scrive comunque.

Poiché qui ci sono diverse risposte sul reindirizzamento, aggiungerò questo bel gioiello Di recente mi sono imbattuto in un reindirizzamento:

#include <fstream>
#include <iostream>

class redirecter
{
public:
    redirecter(std::ostream & dst, std::ostream & src)
        : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
    ~redirecter() { src.rdbuf(sbuf); }
private:
    std::ostream & src;
    std::streambuf * const sbuf;
};

void hello_world()
{
    std::cout << "Hello, world!\n";
}

int main()
{
    std::ofstream log("hello-world.log");
    redirecter redirect(log, std::cout);
    hello_world();
    return 0;
}

Fondamentalmente è una classe di reindirizzamento che ti consente di reindirizzare due flussi qualsiasi e ripristinarli al termine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top