Tengo una biblioteca escrita en C con glib/gobject. Produce una cantidad significativa de información de depuración a través de la llamada g_debug()
. Esta información es muy útil para la solución de problemas, sin embargo, no quiero que se muestre, cuando la biblioteca se incluye con la aplicación real. Entonces, básicamente necesito una forma de controlar/filtrar la cantidad de información de depuración y no podría entender cómo se supone que debe funcionar con glib. ¿Podría alguien señalarme en la dirección correcta, por favor?¿Cómo controlar el nivel de información de depuración en glib?
Respuesta
Puede intentar configurar la variable de entorno G_DEBUG
como se menciona en el sitio del desarrollador GLib
. Consulte la sección Environment variable
debajo de Running and debugging GLib Applications
en http://developer.gnome.org/glib/2.28/glib-running.html.
EDITAR: Actualiza para configurar el registrador en el código. Puede usar g_log_set_handler
(http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler) para hacer esto en su código. Inicialmente, puede configurar el manejador de registros en una función ficticia que muestre nada &, luego puede configurar el manejador de registros en g_log_default_handler
según el argumento aprobado para establecer los niveles de registro apropiados. Para establecer los niveles de registro por encima de un nivel establecido, deberá manipular los valores GLogLevelFlags
según su necesidad.
espero que el ejemplo de código a continuación se proporcionan algunos punteros
#include <glib.h>
#include <stdio.h>
#include <string.h>
#define G_LOG_DOMAIN ((gchar*) 0)
static void _dummy(const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer user_data)
{
/* Dummy does nothing */
return ;
}
int main(int argc, char **argv)
{
/* Set dummy for all levels */
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, _dummy, NULL);
/* Set default handler based on argument for appropriate log level */
if (argc > 1)
{
/* If -vv passed set to ONLY debug */
if(!strncmp("-vv", argv[1], 3))
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, g_log_default_handler, NULL);
}
/* If -v passed set to ONLY info */
else if(!strncmp("-v", argv[1], 2))
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, g_log_default_handler, NULL);
}
/* For everything else, set to back to default*/
else
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, g_log_default_handler, NULL);
}
}
else /* If no arguments then set to ONLY warning & critical levels */
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING| G_LOG_LEVEL_CRITICAL, g_log_default_handler, NULL);
}
g_warning("This is warning\n");
g_message("This is message\n");
g_debug("This is debug\n");
g_critical("This is critical\n");
g_log(NULL, G_LOG_LEVEL_INFO , "This is info\n");
return 0;
}
Espero que esto ayude!
he implementado manejador de registro personalizado y así es como se vio después:
void custom_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
{
gint debug_level = GPOINTER_TO_INT (user_data);
/* filter out messages depending on debugging level */
if ((log_level & G_LOG_LEVEL_DEBUG) && debug_level < MyLogLevel_DEBUG) {
return;
}
else if ((log_level & G_LOG_LEVEL_INFO) && debug_level < MyLogLevel_INFO) {
return;
}
g_printf ("%s\n", message);
}
int main(int argc, char *argv[])
{
...
if (verbose) {
g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_DEBUG));
}
else {
g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_NORMAL));
}
...
}
espero que será útil a alguien :-)
- 1. ¿cómo configuro el nivel de registro para información para MongoDb?
- 2. ¿Cómo configurar glib en Makefile?
- 3. ¿Cómo configuro el registro de Ruby Sequel en el nivel de DEPURACIÓN?
- 4. Determinar si el registrador de raíz está configurado en nivel de DEPURACIÓN en Python?
- 5. ¿Cómo registrar la información de depuración de ssh?
- 6. Cómo extraer información de depuración de un bloqueo
- 7. Biblioteca para leer el archivo ELF Información de depuración DWARF
- 8. IntelliJ "Información de depuración no disponible": ¿cómo solucionarlo?
- 9. Salida de información de depuración en la consola
- 10. Visual Studio: información de depuración en la compilación de lanzamiento
- 11. Depuración de OpenGL o información detallada en la consola
- 12. ¿Qué información incluir en cada nivel de registro?
- 13. Controlar el ancho de una ventana de información de Google Maps
- 14. configuración de registro de commons: use SimpleLog y establezca el nivel de depuración
- 15. Cómo cambiar el nivel de los mensajes de información de AX
- 16. Imprimir información de depuración del procedimiento almacenado en MySQL
- 17. ¿Qué significa "Generar información de depuración" en VB/C#?
- 18. GridLayout escupir "restricción" inconsistente registros de nivel de depuración
- 19. Tiempos de espera variables en GLib
- 20. ¿Cómo habilitar el registro de nivel de DEPURACIÓN con Jetty incrustado?
- 21. instalando gtk y glib
- 22. Error de la aplicación .NET sin información de depuración
- 23. Controlar el tamaño del elemento de superposición
- 24. Mostrar información de depuración de excepciones a los usuarios
- 25. ¿La compilación de depuración de Visual Studio contiene información personal?
- 26. Linux glib necesita pkg-config y pkg-config necesita glib?
- 27. ¿Cómo controlar el comportamiento de json_encode?
- 28. Cómo cargar capas según el nivel de zoom?
- 29. ¿Cómo puedo imprimir información sobre un NET: HTTPRequest para depuración?
- 30. ¿Cómo controlar el volumen de los medios?
no es exactamente lo que estoy buscando. Todo lo que quiero que pase -v tenga solo INFO y los mensajes anteriores que se mostrarán y -vv también incluirá la eliminación de fallas. Si no se proporciona ningún parámetro, solo muestre ADVERTENCIA y CRÍTICO. Básicamente, lo que estoy buscando es una forma de controlar esto desde la aplicación interna. Por lo que yo entiendo, la variable de entorno G_DEBUG es para diferentes propósitos. – dtoux
Gracias @ another.anon.coward. Solo ahora noté tu edición y esta es exactamente la respuesta que estaba buscando. Bueno, en este momento he hecho exactamente lo mismo por mí mismo, pero gracias de todos modos ;-) – dtoux