A maneira padrão de fazer login a partir de um programa em C é syslog
.
Comece incluindo o arquivo de cabeçalho:
#include <syslog.h>
Em seguida, 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 é automaticamente adicionada no início de cada mensagem. Coloque o nome do seu programa aqui.
O segundo argumento é as opções que você deseja usar ou 0
para 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 com que o syslog também registre o id do processo na mensagem de log.
Então, toda vez que você quiser escrever uma mensagem de log, você chama syslog
:
syslog(LOG_INFO, "%s", "Message");
O primeiro argumento é a prioridade. A prioridade varia de DEBUG
(menos importante) a EMERG
(somente para emergências), sendo DEBUG
, INFO
e ERR
os mais comumente usados. Veja man 3 syslog
para suas opções.
O segundo e terceiro argumentos são um formato e uma mensagem, assim como o printf.
Qual arquivo de log isso aparece depende das configurações do seu syslog.
Com uma configuração padrão, provavelmente vai para /var/log/messages
.
Você pode configurar um arquivo de log personalizado usando um dos recursos no intervalo LOG_LOCAL0
to LOG_LOCAL7
.
Você os usa mudando:
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 parte .info
de local1.info
acima significa que todas as mensagens que são INFO
ou mais importantes serão registradas, incluindo INFO
, NOTICE
, ERR
(erro), CRIT
(erro crítico) ), etc., mas não DEBUG
.
Ou, se tiver rsyslog
, você pode tentar um filtro baseado em propriedade , por exemplo
:syslogtag, isequal, "programname:" /var/log/programname.log
O syslogtag deve conter um ":".
Ou, se você está planejando distribuir seu software para outras pessoas, provavelmente não é uma boa ideia confiar em usar LOG_LOCAL
ou um filtro rsyslog
.
Nesse caso, você deve usar LOG_USER
(se for um programa normal) ou LOG_DAEMON
(se for um servidor), gravar suas mensagens de inicialização e mensagens de erro usando syslog
, mas gravar todas as suas mensagens de log para um arquivo fora de syslog
. Por exemplo, o Apache HTTPd registra em /var/log/apache2/*
ou /var/log/httpd/*
, suponho que eu esteja usando as chamadas regulares open
/ fopen
e write
/ printf
.