c - logs - Daemon logging en Linux
print log linux (10)
Como se indicó anteriormente, debe buscar en syslog. Pero si quiere escribir su propio código de registro, le aconsejo que use el modo "a" (escribir anexar) de fopen.
Algunas desventajas de escribir su propio código de registro son: Manejo de rotación de registros, Bloqueo (si tiene múltiples hilos), Sincronización (¿desea esperar a que los registros se escriban en el disco?). Uno de los inconvenientes de syslog es que la aplicación no sabe si los registros se han escrito en el disco (podrían haberse perdido).
Así que tengo un daemon ejecutándose en un sistema Linux, y quiero tener un registro de sus actividades: un registro. La pregunta es, ¿cuál es la "mejor" forma de lograr esto?
Mi primera idea es simplemente abrir un archivo y escribir en él.
FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s/n", (char*)bar);
/* ...all done, close the file */
fclose(log);
¿Hay algo intrínsecamente incorrecto en iniciar sesión de esta manera? ¿Hay alguna manera mejor, como algún marco integrado en Linux?
Escucho muchos mensajes daemon a daemon.info y daemon.debug cuando estoy probando la unidad. Una línea en su syslog.conf puede pegar esos mensajes en cualquier archivo que desee.
http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html tiene una mejor explicación de la API C que la página man, imo.
Hasta el momento, nadie mencionó la biblioteca de registro de impulso que tiene una manera fácil y agradable de redirigir sus mensajes de registro a los archivos o al receptor Syslog o incluso al registro de eventos de Windows.
Hay muchos problemas potenciales: por ejemplo, si el disco está lleno, ¿quiere que su daemon falle? Además, sobrescribirá su archivo cada vez. A menudo, se utiliza un archivo circular para que tenga espacio asignado en la máquina para su archivo, pero puede mantener suficiente historial para ser útil sin ocupar demasiado espacio. Hay herramientas como log4c que pueden ayudarlo. Si su código es c ++, entonces podría considerar log4cxx en el proyecto Apache (apt-get install liblog4cxx9-dev en ubuntu / debian), pero parece que está utilizando C.
Nuestro sistema integrado no tiene syslog, por lo que los daemons que escribo depuran en un archivo usando el modo abierto "a" similar a como lo describió. Tengo una función que abre un archivo de registro, escupe el mensaje y luego cierra el archivo (solo hago esto cuando ocurre algo inesperado). Sin embargo, también tuve que escribir código para manejar la rotación de registros, como han mencionado otros comentadores, que consiste en ''tail -c 65536 logfile> logfiletmp && mv logfiletmp logfile''. Es bastante difícil y quizás debería llamarse "truncamiento frontal de registro" pero impide que nuestro pequeño sistema de archivos basado en disco RAM se llene con el archivo de registro.
Otra ventaja de syslog en instalaciones más grandes (o más conscientes de la seguridad): el daemon syslog se puede configurar para enviar los registros a otro servidor para grabar allí en lugar de (o además de) el sistema de archivos local.
Es mucho más conveniente tener todos los registros de la granja de servidores en un solo lugar en lugar de tener que leerlos por separado en cada máquina, especialmente cuando intenta correlacionar eventos en un servidor con los de otro. Y cuando uno se resquebraja, ya no puede confiar en sus registros ... pero si el servidor de registro permanece seguro, sabrá que nada habrá sido eliminado de sus registros, por lo que cualquier registro de la intrusión estará intacto.
Si utiliza el enhebrado y utiliza el registro como una herramienta de depuración, querrá buscar una biblioteca de registro que utilice algún tipo de búferes de anillo seguros para subprocesos pero desbloqueados. Un buffer por hilo, con un bloqueo global solo cuando sea estrictamente necesario.
Esto evita el inicio de sesión, lo que ocasiona graves ralentizaciones en el software y evita crear heisenbugs que cambian cuando agrega el registro de depuración.
Si tiene un formato de registro binario comprimido de alta velocidad que no pierde tiempo con las operaciones de formato durante el registro y algunas herramientas agradables de análisis y visualización de registros, eso es una ventaja.
Proporcionaría una referencia a un buen código para esto, pero yo no tengo uno. Solo quiero uno. :)
Syslog es una buena opción, pero es posible que desee considerar log4c. Los marcos log4 [algo] funcionan bien en sus implementaciones de Java y Perl, y le permiten, desde un archivo de configuración, elegir iniciar sesión en syslog, consola, archivos planos o escritores de registro definidos por el usuario. Puede definir contextos de registro específicos para cada uno de sus módulos, y tener cada registro de contexto en un nivel diferente según lo definido por su configuración. (rastreo, depuración, información, advertencia, error, crítico), y haga que su daemon vuelva a leer ese archivo de configuración atrapando una señal, lo que le permite manipular niveles de registro en un servidor en ejecución.
Unix ha tenido durante mucho tiempo un marco de registro especial llamado syslog . Escriba su caparazón
man 3 syslog
y obtendrá la ayuda para la interfaz C para ello.
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
int main(void) {
openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "A different kind of Hello world ... ");
closelog();
return 0;
}
Probablemente se trate de una carrera de caballos, pero sí, la función syslog que existe en la mayoría, si no en todas, las derivadas de Un * x es la mejor opción. No hay nada de malo en iniciar sesión en un archivo, pero deja en sus hombros una serie de tareas:
- ¿hay un sistema de archivos en su ubicación de registro para guardar el archivo?
- ¿qué pasa con el almacenamiento en búfer (para el rendimiento) frente a la descarga (para obtener registros escritos antes de un bloqueo del sistema)
- si su daemon se ejecuta durante un tiempo prolongado, ¿qué hace con el archivo de registro en constante crecimiento?
Syslog se ocupa de todo esto, y más, para ti. La API es similar al clan printf, por lo que no debería tener problemas para adaptar su código.