Pregunta

Me he estado preguntando, ¿cuál es el punto de obstruir?Por lo que puedo decir, clog es lo mismo que cerr pero con almacenamiento en búfer, por lo que es más eficiente.Por lo general, stderr es lo mismo que stdout, por lo que clog es lo mismo que cout.Esto me parece bastante tonto, así que supongo que debo estar entendiéndolo mal.Si tengo mensajes de registro que se envían al mismo lugar al que se envían mensajes de error (tal vez algo en /var/log/messages), entonces probablemente no estoy escribiendo demasiado (por lo que no se pierde mucho al usar no -cerr amortiguado).En mi experiencia, quiero que mis mensajes de registro estén actualizados (no almacenados en el búfer) para poder ayudar a encontrar un bloqueo (por lo que no quiero usar la obstrucción almacenada en el búfer).Aparentemente siempre debería usar cerr.

Me gustaría poder redirigir la obstrucción dentro de mi programa.Sería útil redirigir cerr para que cuando llame a una rutina de biblioteca pueda controlar adónde van cerr y clog.¿Pueden algunos compiladores admitir esto?Acabo de comprobar DJGPP y la salida estándar está definida como la dirección de una estructura FILE, por lo que es ilegal hacer algo como "stdout = freopen(...)".

  • ¿Es posible redirigir clog, cerr, cout, stdin, stdout y/o stderr?
  • ¿La única diferencia entre obstruir y cerrar es el almacenamiento en búfer?
  • ¿Cómo debo implementar (o encontrar) una función de registro más sólida (enlaces, por favor)?
¿Fue útil?

Solución

¿Es posible redirigir clog, cerr, cout, stdin, stdout y/o stderr?

Sí.Quiere que el rdbuf función.

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

¿La única diferencia entre obstruir y cerrar es el almacenamiento en búfer?

Hasta donde yo sé, sí.

Otros consejos

Si está en un entorno de shell Posix (realmente estoy pensando en Bash), puede redirigir cualquier descriptor de archivo a cualquier otro descriptor de archivos, para redirigir, puede: solo: puede:

$ myprogram 2>&5 

para redirigir stderr al archivo representado por fd=5.

Editar:Pensándolo bien, me gusta más la respuesta de @Konrad Rudolph sobre la redirección.rdbuf() es una forma más coherente y portátil de hacerlo.

En cuanto al registro, bueno... empiezo con la biblioteca Boost para todo lo relacionado con C++ que no esté en la biblioteca estándar.Mirad: Impulsar el registro v2

Editar:El registro de impulso es no parte de las Bibliotecas Boost;ha sido revisado, pero no aceptado.

Editar:2 años después, en mayo de 2010, Boost aceptó una biblioteca de registro, ahora llamada Impulsar.Registro.

Por supuesto, existen alternativas:

  • Log4Cpp (una API estilo log4j para C++)
  • Log4Cxx (API estilo log4j patrocinada por Apache)
  • panteón (¿difunto?la última vez que lo intenté no pude lograr que se basara en un compilador reciente)
  • Registro de Google (punta de sombrero @SuperElectric)

También está el registrador de eventos de Windows.

Y un par de artículos que pueden ser de utilidad:

Registrador básico

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

Usado como myerr("ERR: " << message); o myerr("WARN: " << message << code << etc);

Es muy efectivo.

Entonces hazlo:

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

o simplemente analizar stderr.log a mano

Admito que esto no es para extremadamente Código crítico para el rendimiento.Pero, ¿quién escribe eso?

Dado que aquí hay varias respuestas sobre la redirección, agregaré esta bonita joya Me topé recientemente con la redirección:

#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;
}

Básicamente es una clase de redirección que le permite redirigir dos transmisiones cualesquiera y restaurarlas cuando haya terminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top