criar um arquivo de log

22

Existe alguma maneira de criar um arquivo de log para manter alguns dados em / var / log / com a ajuda de alguma função de biblioteca ou chamada do sistema na linguagem c no linux. E também quero conhecer os padrões que devemos seguir para escrever e processar o log. obrigado

Sushant Jain
fonte
Observe que as questões de programação geralmente são fora de tópico aqui; você deve perguntar a eles no Stack Overflow . Uma explicação da API está ok aqui, mas explicações sobre como usá-la em C ou outra linguagem de programação normalmente pertencem ao Stack Overflow.
Gilles 'SO- stop be evil'

Respostas:

31

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

Mikel
fonte
Obrigado. Esta é uma informação bastante útil. Mas você poderia explicar mais na opção log_local0-7. Por exemplo. Quero gravar meus dados (que possuem <self> palavra na linha de log) no arquivo self.log. e alguns logs em outros arquivos.
Sushant Jain
@Sushant Jain: Qual distribuição e versão do Linux você está alvejando? Você tem syslog antigo (ksyslogd) ou rsyslog? rpm -qa | grep syslogou dpkg -l '*syslog*'provavelmente lhe dirá qual.
25411 Mikel
log_local * são, francamente, relíquias da época em que sysklogdera o único jogo na cidade para software syslog. Hoje em dia software como syslog-ng, rsysloge dsyslogexistem e têm capacidades de filtragem muito mais sofisticado do serviço apenas / nível.
Shadur
Muito obrigado. Meu problema foi resolvido. Tenho mais uma consulta sobre a análise de dados armazenados no arquivo de log. Existe alguma maneira de fazer isso? Na verdade, estou tentando criar uma ferramenta de estatística do sistema. Então eu preciso disso.
Sushant Jain
@Sushant Jain. Feliz em ajudar. Poste sua pergunta de análise de log como uma pergunta separada para que as pessoas possam vê-la e fornecer respostas adequadas.
27411 Mikel
2

Você desejará #include <syslog.h>usar as syslog()funções para enviar dados para qualquer programa de registro do sistema que esteja ativo.

Veja a página de manual aqui .

Caleb
fonte
A função syslog () grava dados em / var / log / syslog. enquanto eu quero escrever logs no meu próprio arquivo.
Sushant Jain
Como Mikel explica abaixo, você pode marcar suas mensagens de log de maneira que o syslog entenda qual programa você é e, em seguida, configure o syslog para gravar as mensagens de log de seus programas em um arquivo diferente.
Caleb
1

Existem muitas possibilidades, qual é o seu plano? Você só precisa de uma opção para fazer logon na linha de comando? Dê uma olhada logger(incluído no bsdutils ). Basta digitar:

usr@srv % logger test

e registrará algo assim no seu /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

ver também man logger. Dependendo do seu daemon de log, você pode classificar essas mensagens para arquivos específicos ou filtrá-las por prioridade.

Existem também algumas soluções para diferentes linguagens de programação, então, diga-me o que você quer fazer ;-)

binfalse
fonte
Na verdade, eu quero fazê-lo usando a linguagem c. e eu tenho informações no Mikel Post.
Sushant Jain
1

A filtragem pelo nome do programa é escrita de maneira diferente da mencionada acima, para versões recentes de rsyslog(a versão na minha máquina é 5.8.6), como mostrado abaixo:

if $programname == 'popa3d' then /var/log/popa3d.log

Para mais informações, veja aqui

suresh
fonte