A maneira padrão de fazer logon de um programa em C é syslog.
Comece incluindo o arquivo de cabeçalho:
#include <syslog.h>
No início do seu programa, você deve configurar o syslog chamando openlog:
openlog("programname", 0, LOG_USER);
O primeiro argumento é a identificação ou a tag, que é adicionada automaticamente no início de cada mensagem. Coloque aqui o nome do seu programa.
O segundo argumento são as opções que você deseja usar ou 0para o comportamento normal. A lista completa de opções está em man 3 syslog. Um que você pode achar útil é LOG_PID, o que faz o syslog também registrar a identificação do processo na mensagem de log.
Então, sempre que você quiser escrever uma mensagem de log, ligue para syslog:
syslog(LOG_INFO, "%s", "Message");
O primeiro argumento é a prioridade. As gamas de prioridade DEBUG(menos importantes) para EMERG(apenas para situações de emergência) com DEBUG, INFOe ERRsendo a mais utilizada. Veja man 3 syslogpara suas opções.
O segundo e o terceiro argumentos são um formato e uma mensagem, assim como printf.
O arquivo de log em que isso aparece depende das configurações do seu syslog.
Com uma configuração padrão, provavelmente entra /var/log/messages.
Você pode configurar um arquivo de log personalizado usando um dos recursos no intervalo LOG_LOCAL0de LOG_LOCAL7.
Você os usa alterando:
openlog("programname", 0, LOG_USER);
para
openlog("programname", 0, LOG_LOCAL0);
ou
openlog("programname", 0, LOG_LOCAL1);
etc.
e adicionando uma entrada correspondente a /etc/syslog.conf, por exemplo
local1.info /var/log/programname.log
e reiniciando o servidor syslog, por exemplo
pkill -HUP syslogd
A .infoparte de local1.infomeios acima que todas as mensagens que são INFOou mais importantes serão registrados, incluindo INFO, NOTICE, ERR(erro), CRIT(crítico), etc., mas não DEBUG.
Ou, se você tiver rsyslog, tente um filtro baseado em propriedades , por exemplo
:syslogtag, isequal, "programname:" /var/log/programname.log
O syslogtag deve conter um ":".
Ou, se você planeja distribuir seu software para outras pessoas, provavelmente não é uma boa ideia confiar no uso LOG_LOCALou em um rsyslogfiltro.
Nesse caso, você deve usar LOG_USER(se for um programa normal) ou LOG_DAEMON(se for um servidor), escrever suas mensagens de inicialização e mensagens de erro usando syslog, mas gravar todas as suas mensagens de log em um arquivo fora de syslog. Por exemplo, o Apache HTTPd registra /var/log/apache2/*ou /var/log/httpd/*, suponho que use chamadas / e open/ regulares .fopenwriteprintf