c++ logging log4cpp

c++ - ¿Cuál es el punto de obstrucción?



logging log4cpp (3)

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

Sí. Desea la función rdbuf .

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

¿La única diferencia entre clog y cerr es el almacenamiento en búfer?

Por lo que yo sé, sí.

Me he estado preguntando, ¿cuál es el punto de obstrucción? Por lo que puedo decir, el atasco es el mismo que el cerr, pero con el 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 cojo, así que creo que debo estar malentendiéndolo. Si tengo mensajes de registro que salen al mismo lugar donde tengo mensajes de error (tal vez algo en / var / log / messages), entonces probablemente no estoy escribiendo demasiado (así que no se pierde mucho al usar -Carrr con código). 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 el zueco almacenado). Aparentemente siempre debería estar usando cerr.

Me gustaría poder redirigir el bloqueo dentro de mi programa. Sería útil redirigir cerr para que cuando llamo a una rutina de la biblioteca pueda controlar a dónde van cerr y clog. ¿Pueden algunos compiladores apoyar esto? Acabo de comprobar DJGPP y stdout se define como la dirección de una estructura FILE, por lo que es ilegal hacer algo como "stdout = freopen (...)".

  • ¿Es posible redirigir zlog, cerr, cout, stdin, stdout y / o stderr?
  • ¿La única diferencia entre clog y cerr es el almacenamiento en búfer?
  • ¿Cómo debería implementar (o encontrar) un servicio de registro más sólido (enlaces, por favor)?

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 un código extremadamente crítico para el rendimiento. Pero quién escribe eso de todos modos.


Si estás en un entorno de shell posix (realmente estoy pensando en bash), puedes redirigir cualquier descriptor de archivo a cualquier otro descriptor de archivo, así que para redireccionar, puedes simplemente:

$ myprogram 2>&5

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 de Boost por todo lo que C ++ no está en la biblioteca estándar. He aquí: Boost Logging v2

Editar : Boost Logging no es parte de Boost Libraries; ha sido revisado, pero no aceptado.

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

Por supuesto, hay alternativas:

  • Log4Cpp (una API de log4j-style para C ++)
  • Log4Cxx (Apache-patrocinado log4j-style API)
  • Pantheios (¿desaparecido? La última vez que lo intenté, no pude conseguir que compilara un compilador reciente)
  • GLog de Google (hat-tip @SuperElectric)

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

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