Outras dicas

Existem várias opções para melhorar o desempenho syslog:

  • Optimizar a chamadas com um macro

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    Uma vantagem de usar uma macro para chamadas de filtro syslog é que toda a chamada é reduzido a um salto condicional em uma variável global, muito útil se acontecer de você ter chamadas de depuração que estão traduzindo grandes conjuntos de dados através de outras funções.

  • setlogmask ()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask () irá otimizar a chamada não log para / dev / log, mas o programa irá ainda chamar as funções usadas como argumentos.

  • filtragem com syslog.conf

     *.err                                               /var/log/messages
    

    "veja a página de manual do syslog.conf para mais detalhes."

  • configure syslog para fazer o log assíncrono ou tamponada

    metalog utilizada para armazenar temporariamente a saída do log e corou-lo em blocos. estoque syslog e syslog-ng não faça isso, tanto quanto eu sei.

Antes de embarcar no novo daemon escrita que você pode verificar se syslog-ng é mais rápido (ou pode ser configurado para ser mais rápido) do que simples syslog de idade.

Um truque que você pode usar se você controlar a origem para o aplicativo de registro é para mascarar o nível de registro que você quer no próprio aplicativo, em vez de no syslog.conf. Eu fiz isso anos atrás, com um aplicativo que gerou uma enorme enorme enorme quantidade de logs de depuração,,. Em vez de remover as chamadas a partir do código de produção, nós apenas mascarado modo que o nível de depuração nunca chama foi enviado para o daemon. Na verdade, eu encontrei o código, é Perl, mas é apenas uma fachada para o (3) chamada setlogmask.

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

Não sei por que eu usei decimal em vez de uma máscara de bits ... ombros

Escreva a sua própria implementação syslog. :-P

Isso pode ser feito de duas maneiras.

  1. Escreva a sua própria gancho LD_PRELOAD para substituir as funções de syslog, e torná-los saída para stderr vez. Na verdade, eu escrevi um post sobre isso há muitos anos: http://marc.info/?m=97175526803720 :-P
  2. Escreva seu próprio daemon syslog. É apenas uma simples questão de pegar datagramas fora do /dev/log! :-P

Ok, ok, assim que estas são as duas respostas brincalhões. Você já perfilado syslogd para ver onde ele está bloqueando a maior parte?

Você pode configurar o nível do syslogd (ou instalação) para fazer logon de forma assíncrona, colocando um sinal de menos antes de caminho para arquivo de log (ie .: utilizador * [Tab] -. / Var / log / user.log).

Felicidades.

A implementação syslog-assíncrona () pode ajudar, correndo o risco de linhas de registo / atrasos delimitadas perdidos em outros momentos. http://thekelleys.org.uk/syslog-async/

Nota: 'assíncrona' aqui se refere a fila eventos de log dentro de sua aplicação, e não a opção de configuração de arquivo assíncrona saída syslogd que outras respostas consulte

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top