Muchas aplicaciones han de registrar sus actividades. A menudo, los programas de sistema escriben mensajes a las consolas o a un archivo de registro. Dichos mensajes pueden indicar errores, advertencias, o información más general sobre el estado del sistema. Por ejemplo, el programa su puede registrar el hecho de que un usuario haya intentado obtener privilegios de superusuario, fallando en el intento.
Con frecuencia, estos mensajes de registros se guardan en archivos de sistema en un directorio creado para tal finalidad. Puede ser /usr/adm
o /var/log
. En una instalación típica de Linux, el archivo /var/log/messages
contiene todos los mensajes del sistema, /var/log/mail contiene otros mensajes de registros del sistema de correo electrónico, y /var/log/debug
contiene mensajes de error. Puede comprobar la configuración de su sistema en los archivos /etc/syslog.conf
o /etc/syslog-ng/syslog-ng.conf
, dependiendo de su versión de Linux.
Algunos sistemas UNIX no proporcionan esta clase de mensajes legibles, sino que proveen al administrador de herramientas para poder leer una base de datos que contiene eventos del sistema.
A pesar de que el formato y el almacenamiento de los mensajes del sistema pueden variar, el método para generar mensajes es estándar. La especificación UNIX proporciona una interfaz para que todos los programas generen mensajes de registro usando la función syslog
:
La función
syslog
envía un mensaje de registro a la prestación de registro.
Cada mensaje tiene un argumento priority que es un OR a nivel de bit de un intenso nivel y un valor básico.
El nivel intenso controla el cumplimiento del mensaje de registro y el valor básico registra al creador del mensaje.
Los valores básicos (de syslog.h) incluyen:
- LOG_USER .- Indica que el mensaje proviene de una aplicación de usuario (la predeterminada).
- LOG_LOCAL0 (y así hasta LOG_LOCAL7) .- A estos valores el administrador local, puede asignar significados.
Dependiendo de la configuración del sistema, los mensajes LOG_EMERG
pueden aparecerse a todos los usuarios, los mensajes LOG_ALERT
pueden ser enviados al administrador, los mensajes LOG_DEBUG
se pueden ignorar, y el resto pueden ser enviados a un archivo de mensajes. Puede escribir un programa que use la prestación de registro llamando únicamente a syslog
cuando desee crear el mensaje de registro.
El mensaje de registro creado por syslog
está compuesto por una cabecera de mensaje y un cuerpo de mensaje. La cabecera se crea a partir del indicador de prestación y de la fecha y la hora. El cuerpo del mensaje es creado a partir del parámetro message
para syslog
, que actúa como una cadena de formato printf
. El resto de argumentos de syslog
se usan de acuerdo con los especificadores de conversión de estilo printf
en la cadena message
. Además, se puede usar el especificador %m
para insertar la cadena de mensaje de error asociada con el valor actual de la variable de error, errno
. Esto puede ser útil para registrar mensajes de error.
Vamos a escribir el programa syslog.c que intentará abrir un archivo inexistente:
Al compilar y ejecutar el programa,
syslog.c
, no verá ninguna salida, pero el archivo /var/log/messages
contendrá la siguiente línea en la parte final:
En este programa, intentamos abrir un archivo que no existe. Cuando falla, llamamos a syslog
para registrar el suceso en el registro del sistema.
Tenga en cuenta que un mensaje de registro no indica qué programa llamó a la prestación de registro, sino que registra el hecho de que se llamó a syslog
con un mensaje. El especificador de conversión %m
ha sido reemplazado por una descripción del error, en este caso, indicando que no se puede encontrar el archivo. Esto resulta más útil que informar simplemente del número de error.
Otras funciones empleadas para alterar el comportamiento de las prestaciones de registro están definidas en syslog.h
:
Puede modificar el método de presentación de sus mensajes de registro mediante una llamada a la función
openlog
.
De esta manera podrá configurar una cadena,
ident
, que se aplicará a los mensajes de registro.
Puede usarla para indicar que programa ha creado el mensaje. El parámetro
facility
registra un valor de prestación predeterminado que se usará para futuras llamadas a syslog
. El valor predeterminado es LOG_USER
.
El parámetro logopt
configura el comportamiento de las llamadas futuras a syslog
.
Se trata de un
OR
a modo de bit con cero o más parámetros en la siguiente tabla.
La función
openlog
asignará un descriptor de archivo que se usará para escribir a la prestación de registro. Puede cerrarlo mediante la función closelog
. Tenga en cuenta que no necesita llamar a openlog
antes de llamar a syslog
porque syslog
abrirá la prestación de registro si fuese necesario.
Puede controlar el nivel de prioridad de sus mensajes de registro estableciendo una máscara de registro mediante setlogmask
. A partir de ahí, serán rechazadas todas las llamadas a syslof
con niveles de prioridad que no consten en la máscara de registro. De manera que podrá usarla, por ejemplo, para desactivar los mensajes LOG_DEBUG
sin tener que alterar el cuerpo del programa.
Puede crear la máscara para los mensajes de registro usando LOG_MASK
(priority
), que crea una máscara con un solo nivel de prioridad, o LOG_UPTO
(priority), que crea una máscara compuesta por todas las prioridades hasta la prioridad específica, inclusive.