es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de monitorear en tiempo real el syslog desde una aplicación C++ en Linux?

Estoy en una placa ARM Linux que tiene algunos problemas USB cuando se conecta o desconecta un dispositivo USB 1.1 a los puertos USB 3.0, en ese caso se genera un mensaje del kernel, algo así:

[14720.301195@0] usb 1-1.4: estado urb -32

Este mensaje literalmente inunda el syslog repitiéndose cientos de veces. Mi aplicación necesita interceptar este mensaje lo antes posible y realizar algunas acciones, como liberar algunos periféricos y reinstantar algunos objetos. Dado que el error solo se genera mientras otros dispositivos USB 1.1 están abiertos y en uso, tan pronto como los libero, el error desaparece. Parece ser la única forma de evitar la inundación de mensajes.

He intentado con la comprobación continua del comando de bash:

tail -n 1 /var/log/syslog

pero aparentemente el archivo de registro no se actualiza lo suficientemente rápido, incluso si monto /var/log/ en un disco RAM (ramfs).

No sé cómo más podría “conectarme” al syslog y leer los mensajes en tiempo real, tan pronto como se generan.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para interceptar y manejar los mensajes del kernel generados por el dispositivo USB 1.1 en la placa ARM Linux es utilizar el daemon syslog-ng.

    Syslog-ng es una aplicación flexible y poderosa de registro del sistema que puede filtrar, analizar y enrutar mensajes de syslog basados en su contenido y origen. Configurando syslog-ng adecuadamente, es posible capturar y procesar los mensajes del kernel en tiempo real, activar acciones específicas basadas en su contenido y también reducir el ruido de syslog generado por otros procesos o aplicaciones.

    Para utilizar syslog-ng en este escenario, siga estos pasos:

    1. Instale syslog-ng en la placa ARM Linux utilizando el gestor de paquetes de la distribución o compilando desde el código fuente.
    2. Configure syslog-ng para capturar los mensajes del kernel del subsistema USB y redirigirlos a un archivo, tubería o programa personalizado.

    Por ejemplo, puede crear un nuevo archivo de configuración para syslog-ng, por ejemplo, /etc/syslog-ng/conf.d/usb.conf, con el siguiente contenido:

    source s_sys { system(); };
    destination d_usb { file("/var/log/usb.log"); };
    filter f_usb { match("usb"); };
    log { source(s_sys); filter(f_usb); destination(d_usb); };
    

    Esta configuración instruye a syslog-ng a utilizar la fuente system(), que captura todos los mensajes de syslog del kernel y aplicaciones, filtrarlos utilizando el filtro f_usb, que coincide con cualquier mensaje que contenga la subcadena “usb”, y redirigirlos a la destino d_usb, que los escribe en el archivo /var/log/usb.log.

    1. Pruebe la configuración de syslog-ng recargando el daemon y generando algunos errores relacionados con USB.

    Para recargar syslog-ng, utilice el siguiente comando:

    $ sudo syslog-ng -s
    

    Esto verificará la sintaxis de los archivos de configuración y recargará el daemon si no se encuentran errores.

    Para generar errores de USB, conecte y desconecte el dispositivo USB 1.1 al puerto USB 3.0 y compruebe el archivo /var/log/usb.log en busca de mensajes.

    1. Implemente las acciones personalizadas necesarias para manejar los errores de USB capturados por syslog-ng.

    Este paso depende de los requisitos de su aplicación y la naturaleza de los errores de USB. Por ejemplo, puede utilizar un script o programa para analizar periódicamente el archivo /var/log/usb.log, extraer la información relevante de los mensajes y activar las acciones necesarias en base a eso.

    Alternativamente, puede utilizar las capacidades integradas de syslog-ng para ejecutar un script o redirigir los mensajes a otro programa cuando se detecte un patrón o palabra clave específica en el contenido del mensaje. Esto se puede hacer agregando un bloque de acción a la declaración de registro en el archivo de configuración de syslog-ng, por ejemplo:

    log { 
      source(s_sys); 
      filter(f_usb); 
      destination(d_usb); 
      program("/ruta/a/mi/script.sh" template("<$PRI>$MSG\n")); 
    };
    

    Esta configuración ejecutará el script /ruta/a/mi/script.sh cada vez que syslog-ng capture un mensaje USB, pasando el contenido del mensaje como argumento al script. El script puede realizar cualquier acción necesaria, como liberar periféricos y reinstantiar objetos.

    En resumen, utilizar syslog-ng para capturar y manejar los mensajes del kernel generados por un dispositivo USB 1.1 en una placa ARM Linux puede proporcionar una solución confiable y flexible a este problema, permitiendo el monitoreo en tiempo real e interceptación de los errores, así como acciones personalizadas desencadenadas por su ocurrencia.

Comments are closed.