2008-10-01 9 views
61

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?Registro de daemon en Linux

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 con el inicio de sesión de esta manera? ¿Hay alguna manera mejor, como algún marco integrado en Linux?

Respuesta

92

Unix ha tenido durante mucho tiempo un marco de registro especial llamado syslog. Escriba su shell

man 3 syslog 

y obtendrá la ayuda para la interfaz C de la misma.

Someexamples

#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; 
} 
+3

"hombre 3 ..."! No sabía sobre esto. – codemonkey

+4

Es interesante observar que los cambios a esta venerable herramienta se están proponiendo ahora para Linux. Consulte http://www.h-online.com/open/news/item/Journal-end-of-the-line-for-syslog-1382246.html –

+3

@VinkoVrsalovic ¿dónde se guarda el registro? ¡Gracias! – opc0de

0

Hay una gran cantidad de posibles problemas: por ejemplo, si el disco está lleno, ¿Quiere que su demonio 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. Existen 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á usando C.

21

Probablemente este sea un fue carrera de caballos, pero sí, la función syslog que existe en la mayoría, si no en todos, los derivados Un * x es la forma preferida de proceder. No hay nada malo con el registro en un archivo, pero deja en sus hombros una serie de tareas:

  • es que hay un sistema de archivos en la ubicación de registro para guardar el archivo
  • ¿qué pasa con el almacenamiento en búfer (para un rendimiento) vs flushing (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 usted. La API es similar al clan printf, por lo que no debería tener problemas para adaptar su código.

2

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.

Algunos inconvenientes de escribir su propio código de registro son: Manejo de la rotación del registro, Bloqueo (si tiene varios 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).

2

Syslog es una buena opción, pero es posible que desee considerar mirar 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.

11

Otra ventaja de syslog en instalaciones más grandes (o más conscientes de la seguridad): el daemon syslog se puede configurar para enviar registros a otro servidor para grabar allí en lugar de (o además) del sistema de archivos local.

Es mucho más conveniente tener todos los registros para su granja de servidores en un solo lugar en lugar de tener que leerlos por separado en cada equipo, 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.

2

Si utiliza roscado y utilizar el registro como herramienta de depuración, que tendrá que buscar una biblioteca de registro que utiliza algún tipo de seguro para subprocesos, pero memorias cíclicas desbloqueados. Un buffer por hilo, con un bloqueo global solo cuando sea estrictamente necesario.

Esto evita el inicio de sesión, causando 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 el 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é una referencia a un buen código para esto, pero no tengo uno. Solo quiero uno. :)

1

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 otros comentaristas han mencionado 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.

1

Hasta ahora, nadie mencionó boost log library que tiene una manera fácil y fácil de redirigir sus mensajes de registro a archivos o syslog sink o incluso el registro de eventos de Windows.