La forma estándar de iniciar sesión desde un programa en C es syslog.
Comience por incluir el archivo de encabezado:
#include <syslog.h>
Luego, al principio de su programa, debe configurar syslog llamando a openlog:
openlog("programname", 0, LOG_USER);
El primer argumento es la identificación o la etiqueta, que se agrega automáticamente al comienzo de cada mensaje. Pon el nombre de tu programa aquí.
El segundo argumento son las opciones que desea utilizar, o 0para el comportamiento normal. La lista completa de opciones está en man 3 syslog. Uno que puede encontrar útil es LOG_PIDque hace que syslog también registre la identificación del proceso en el mensaje de registro.
Luego, cada vez que desee escribir un mensaje de registro, llame a syslog:
syslog(LOG_INFO, "%s", "Message");
El primer argumento es la prioridad. Los rangos de prioridad de DEBUG(menos importante) a EMERG(sólo para emergencias) con DEBUG, INFOy ERRse utilizan los más comúnmente. Ver man 3 syslogpara sus opciones.
Los argumentos segundo y tercero son un formato y un mensaje, al igual que printf.
En qué archivo de registro aparece esto depende de la configuración de syslog.
Con una configuración predeterminada, probablemente entra /var/log/messages.
Puede configurar un archivo de registro personalizado utilizando una de las instalaciones en el rango LOG_LOCAL0de LOG_LOCAL7.
Los usas cambiando:
openlog("programname", 0, LOG_USER);
a
openlog("programname", 0, LOG_LOCAL0);
o
openlog("programname", 0, LOG_LOCAL1);
etc.
y agregando una entrada correspondiente a /etc/syslog.conf, por ejemplo
local1.info /var/log/programname.log
y reiniciar el servidor syslog, p. ej.
pkill -HUP syslogd
La .infoparte de local1.infomedios anteriores que todos los mensajes que son INFOo más importante será registrada, incluyendo INFO, NOTICE, ERR(error), CRIT(crítico), etc., pero no DEBUG.
O, si lo ha hecho rsyslog, puede probar un filtro basado en propiedades , p. Ej.
:syslogtag, isequal, "programname:" /var/log/programname.log
El syslogtag debe contener un ":".
O bien, si planea distribuir su software a otras personas, probablemente no sea una buena idea confiar en el uso LOG_LOCALo en un rsyslogfiltro.
En ese caso, debe usar LOG_USER(si es un programa normal) o LOG_DAEMON(si es un servidor), escribir sus mensajes de inicio y mensajes de error usando syslog, pero escribir todos sus mensajes de registro en un archivo externo syslog. Por ejemplo, Apache HTTPd inicia sesión en /var/log/apache2/*o /var/log/httpd/*, supongo que usa llamadas regulares open/ fopeny write/ printf.