¿Cuál es el registrador de C ++ seguro para subprocesos más eficiente? [cerrado]

85

Estoy trabajando en una aplicación multiproceso crítica para el rendimiento. Miré el registro de rlog, Ace y Boost. Elegí rlog porque leí que era el más rápido (cuando el registro está deshabilitado, tiene la menor sobrecarga).

El problema que tengo es que muestra el nombre del archivo, el número de línea, etc. incluso en el modo de lanzamiento. Si me puede decir cómo apagar esa información, mi problema podría resolverse. En cualquier caso, ¿cuál es el registrador en C ++ más eficiente para mi situación?

cppalphadev
fuente
23
Estoy llegando rápidamente a la conclusión de que el impulso lo tiene todo. ¡Incluso si no es así, habrá aparecido cuando mires de nuevo!
Martin Beckett
20
No veo por qué esto está cerrado. Hizo una pregunta específica y mensurable. Si descuidamos qué compilador se está utilizando, solo puede haber un "registrador de C ++ seguro para subprocesos más eficiente". Stackoverflow en estos días ....
JohnJohn
1
Ver también github.com/gabime/spdlog
maxik

Respuestas:

35

Lamentablemente, no puedo votar en contra en este momento. Por lo que puedo decir, nunca uses basura como Apache log4cxx. Contiene errores graves.

  1. La última versión de la rama 0.9 es 0.9.7 y todavía contiene pérdidas de memoria porque cada clase con miembros virtuales no tiene dtor virtual.
  2. La última versión 0.10.x perdió mucha funcionalidad de 0.9.xy no es compatible con versiones anteriores. Te ves obligado a reescribir gran parte de tu propio código.
  3. Parece que todo el proyecto no se ha mantenido. El lanzamiento de 0.11.xx se ha anunciado durante 2 años.

En mi opinión, deberías ir con impulso.

kirsche40
fuente
10
"toda clase con miembros virtuales no tiene dtor virtual" no lo creía y había que comprobarlo. Apache bastante decepcionante.
ManuelSchneid3r
6
Puede votar en contra ahora :)
Financia la demanda de Monica el
5
>> "todas las clases con miembros virtuales no tienen dtor virtual" Si bien esto no es maravilloso, no significa que cause un problema. Solo es un problema si las clases se eliminan por su tipo dinámico en lugar de por su tipo estático. Esto, por sí solo, no es un problema en sí mismo y no significa que se filtre ningún recuerdo.
evilrix
1
@evilrix Las clases tienen miembros virtuales pero no dtor virtual. Las clases no tienen nuevos operadores privados / protegidos. De hecho, este es un código muy pobre y malo que nunca debería haberse publicado. Entonces, ¿cuál es tu punto?
kirsche40
@ kirsche40 Pensé que mi punto era bastante claro. ¿Qué parte de mi explicación de cómo está redactada la norma no entendiste? Permítame reformular: es un problema si intenta eliminar a través de un puntero de clase base. En ese caso, si el destructor no es virtual, el comportamiento no está definido. El estándar es inusualmente claro en este punto. Estoy bastante seguro de que nada de lo que dije implica que estoy defendiendo que el OP use esto como una implementación.
evilrix
19

Se cree que Pantheios es la biblioteca de registro de C ++ con mejor rendimiento , además de afirmar que es la única que es 100% segura de tipos (consulte este artículo sobre una biblioteca relacionada que explica por qué las bibliotecas basadas en printf () / iostream no son tipográficas seguro)

dcw
fuente
4
E incluso si no les gusta Pantheios, la lista de "competidores" en la página que vinculó es informativa.
jwd
10

Tuve éxito con log4cxx en http://logging.apache.org/log4cxx/index.html . Es una versión C ++ del popular registrador Log4j, es fácil de configurar a través de un archivo conf o en el código. La sobrecarga cuando está deshabilitada es mínima (llamada de método y comparación de enteros).

El patrón para la salida al registro se define mediante un patrón de conversión que puede ser tan simple como la fecha / hora y un mensaje. También maneja la limitación del tamaño del archivo, la sustitución, etc. También puede configurar diferentes patrones para varios errores y fuentes.

usuario54700
fuente
9

Así es como puede apagar la información adicional que proporciona rlog (como nombre de archivo, número de línea, etc.). Cuando inicializa rlog en su main()función (o donde sea), puede hacer lo siguiente:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

El segundo argumento de StdioNodees que las banderas controlen la salida. Consulte la documentación de rlog (se puede generar con Doxygen) para ver la lista completa de posibles banderas. El del ejemplo aquí hace que rlog solo coloree la salida de acuerdo con la gravedad, sin agregar ninguna otra información.

mandioca
fuente
9

Es posible que desee considerar el sistema logog. logog ofrece exactamente este tipo de funcionalidad, pero no tiene las dependencias de código implícitas que Pantheios tiene. logog es seguro para subprocesos y permite un alto grado de control sobre qué tipos de mensajes se registran en cualquier momento.

Soy el autor y mantenedor de logog, por lo que mi opinión es un poco sesgada. Pero revisé rlog, Pantheios y otros sistemas de registro antes de implementar este.

https://github.com/johnwbyrd/logog .

johnwbyrd
fuente
Enlace actualizado, gracias por la nota.
johnwbyrd
4

Algunos de los gastos generales pueden ocurrir en sus macros / streams. Debe tener mucho cuidado de no componer la cadena que se registra cuando el registro está deshabilitado.

El uso inteligente de los flujos y el operador?: Le permite hacer eso, al igual que las macros.


fuente
2

tal vez pantheios,
aunque no sé si es seguro para subprocesos o no ...

mhd
fuente
8
Es seguro
subprocesos
2

pruebe la biblioteca c-log, https://github.com/0xmalloc/c-log , una biblioteca de registros rápida, estable y segura para subprocesos para lenguaje C / C ++.

usuario2538508
fuente
8
Desafortunadamente, c-log está bajo GPL, lo que significa que no puede usarlo con software no compatible con GPL (por ejemplo, comercial propietario). Esto lo hace inutilizable para muchos usuarios.
chris
ahora no hay LICENCIA en github.com/0xmalloc/c-log. Es gratis para uso comercial y personal.
user2538508
2
¿Es usted el autor de c-log? Si es así, le sugiero que indique explícitamente (en la página de Github, el archivo Léame y los comentarios en el código fuente) bajo qué licencia se publica su software. Incluso si está destinado a ser de dominio público (¡lo cual no recomiendo!), Debe indicarlo explícitamente. Dicho esto, hay muchas licencias de código abierto "amigables con el comercio" (es decir, permisivas) para elegir; las más populares son Apache, BSD o MIT.
chris
¿Solo Linux? ( #include <pthread.h>...)
rustyx