Como dividir logs de acordo com padrões?

2

Gostaria de poder dividir os arquivos de registro de acordo com um padrão encontrado neles.

Por exemplo, processe todos os registros e procure por /(\w+)\s para corresponder a /myresource , mas exclua /myresource/anythingelse para redirecionar tudo para /var/log/extractedlog/myresource/access.log . Eu poderia facilmente fazer o script usando um pouco de grep, mas tentar fazer isso em tempo real poderia tornar o problema mais difícil. Por exemplo, eu gostaria de chamar o programa duas vezes sem gerar duplicatas.

EDITAR

Aqui está um código completo para obter algo assim trabalhando com o syslog-ng /etc/syslog-ng/syslog-ng.conf (os créditos chegam à resposta aceita):

# no-parse let syslog load any source
source s_unparsed_source {
    file("/var/log/myservice/access.log"
        flags(no-parse));
};

# Just protect the input and avoid syslog-ng header to be added in the final log
template t_preserve_message {
    template("$MSG\n");
    template_escape(no);
};

# This will filter the message only matching the given expression
filter f_match_pattern1 {
    match("\/pattern1");
};

destination d_target1 {
    file("/var/log/target/pattern1/access.log" template(t_preserve_message));
};

# The actual logging instruction which wraps everything
log {
    source(s_unparsed_source);
    filter(f_math_pattern1);
    destination(d_target1);
};
    
por AsTeR 15.07.2014 / 10:18

2 respostas

5

Tanto o rsyslog quanto o syslog-ng (os dois programas usuais usados no GNU / Linux para gerenciar logs) têm meios para isso.

Com syslog-ng , você pode definir filtros que corresponde a uma expressão regular :

filter myfilter {
  not match("regex" value("\/usr\/sbin\/run-crons"))
  and not match("regex" value("vmware-checker"));
}

Você também pode usar o banco de dados padrão , que permite a correlação de eventos e o acionamento de ações.

Há também logstash , que tem avançado capacidades de filtragem . Especificamente, ele tem um filtro grep :

filter {
  grep {
    match => { "message" => "hello world" }
  }
}
    
por 15.07.2014 / 10:54
0

Dê uma olhada no Logsurfer .

Eu uso o syslog-ng para o registro "normal" em arquivos e, além disso, canalizo tudo em logsurfer para classificar por programa e localizar mensagens novas / incomuns.

Um snippet da minha configuração, então vejo todos os avisos do openvpn:

'^.{29} .+ openvpn\[[0-9]+\]: (ERROR|WARN)' - - - 0 echo >>lines.openvpn $0
'^.{29} .+ openvpn\[[0-9]+\]: ' - - - 0 ignore
    
por 21.07.2014 / 11:06