La forma estándar de iniciar sesión desde un programa 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 añade automáticamente al inicio de cada mensaje. Pon el nombre de tu programa aquí.
El segundo argumento son las opciones que desea usar, o 0
por el comportamiento normal. La lista completa de opciones está en man 3 syslog
. Uno que podría encontrar útil es LOG_PID
, lo que 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. La prioridad oscila entre DEBUG
(menos importante) a EMERG
(solo para emergencias) con DEBUG
, INFO
y ERR
siendo el más utilizado. Ver man 3 syslog
para sus opciones.
Los argumentos segundo y tercero son un formato y un mensaje, al igual que printf.
El archivo de registro en el que aparece depende de la configuración de syslog.
Con una configuración predeterminada, probablemente entre en /var/log/messages
.
Puede configurar un archivo de registro personalizado utilizando una de las funciones en el rango LOG_LOCAL0
a 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 reiniciando el servidor syslog, por ejemplo,
pkill -HUP syslogd
El .info
parte de local1.info
anterior significa que todos los mensajes que son INFO
o más importantes serán registrados, incluyendo INFO
, NOTICE
, ERR
(error), CRIT
(crítico), etc., pero no DEBUG
.
O, si tiene rsyslog
, puede probar un filtro basado en propiedades, por ejemplo,
:syslogtag, isequal, "programname:" /var/log/programname.log
La etiqueta syslog debe contener un ":".
O, si planea distribuir su software a otras personas, probablemente no sea una buena idea confiar en el uso de LOG_LOCAL
o un rsyslog
filtro.
En ese caso, deberías usar LOG_USER
(si es un programa normal) o LOG_DAEMON
(si es un servidor), escriba sus mensajes de inicio y mensajes de error usando syslog
, pero escribe todos tus mensajes de registro en un archivo fuera de syslog
. Por ejemplo, Apache HTTPd registra en /var/log/apache2/*
o /var/log/httpd/*
, supongo que usando open
regular /fopen
y write
/printf
llamadas.
Querrás #include <syslog.h>
, luego usa el syslog()
funciones para enviar datos a cualquier programa de registro del sistema que esté activo.
Vea la página man aquí.