Log4J reencaminhamento de eventos de registo
Pergunta
Eu gostaria de construir um Appender (ou algo similar) que inspeciona os eventos e, sob certas condições cria registros novos eventos.
Um exemplo seria e crescente Appender que verifica se uma certa quantidade de eventos idênticos são registrados e em caso afirmativo registra o evento com um logleve superior. Então, você poderia definir algo como:. Se você receber mais de 10 Advertências idênticas nesta logger, torná-lo um erro
Então, minhas perguntas são:
-
faz algo como isso já existe?
-
É um Appender a classe certa para implementar esse comportamento?
-
Há algum armadilhas que você poderia pensar que eu deveria olhar para fora?
Esclarecimento: Eu estou bem com o algoritmo de reunir e analisar os eventos. Eu vou fazer isso com uma coleção dentro do appender. Persistência não é necessário para o meu propósito. A minha pergunta # 2 é: é um appender o lugar certo para que isso faz? Afinal, não é um comportamento normal para entradas de registro creat para um appender.
Solução
Logback (sucessor de log4j) lhe permitirá activar o registo para qualquer evento através de TurboFilters . Por exemplo, supondo que o mesmo evento ocorre N ou mais vezes em um determinado período de tempo, você pode forçar o evento a ser aceite (independentemente do seu nível). Ver também DuplicateMessageFilter que faz o inverso (negando eventos re-ocorrência).
No entanto, mesmo logback não vai permitir que o nível do evento de registro a ser incrementado. Log4j não quer. Nem quadro é projetado para isso e eu iria desencorajá-lo de tentar incrementar o nível de na mosca e dentro do mesmo segmento. Por outro lado, incrementando o nível durante o pós-processamento é uma questão completamente diferente. Sinalizando outro segmento para gerar um new login evento com um nível mais elevado é uma possibilidade adicional. (Tenha o seu sinal de turbo-filtro de outro segmento para gerar um new login evento com um nível mais elevado.)
Não foi claro da sua pergunta por que você desejava que o nível a ser incrementado. Foi o incremento da razão nível um em si mesmo ou era um meio para um objetivo, que é ter o evento registrado, independentemente do seu nível. Se o último, então TurboFilters de Logback são o caminho a percorrer.
HTH,
Outras dicas
Você pode criar seu próprio appender implementando a interface Appender
fornecido pelo log4j.
http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/Appender.html
Isso seria uma abordagem. Outra seria a utilização de um appender existente e, em seguida, escrever um código que monitora o log. Por exemplo, você pode fazer logon para o banco de dados e, em seguida, escrever um processo que monitora as entradas de log no banco de dados e cria meta-eventos com base no que vê.
É mais depende do que você está confortável com. Uma pergunta que você vai ter que lidar com é como olhar para trás no log para criar seus meta-eventos. Ou você vai ter que eventos acumulam em seu appender ou persistir-los em algum lugar que você pode consultar para construir seus meta-eventos. O problema com a acumular-los é que se você parar e iniciar o seu processo, você quer ter de despejá-los em algum lugar que eles são apanhados de volta para cima ou para começar de novo sempre que o processo é reiniciado.
Por exemplo, digamos que eu quero criar uma entrada de registo a cada 10 vez que um NullPointerException
é lançada. Se eu tiver as entradas de log em um banco de dados de algum tipo, cada vez que um NPE é jogado I executar uma consulta para ver quantos NPEs foram lançados desde a última vez que eu criei uma entrada de registo para eles. Se eu apenas contá-las na memória cada um tempo é jogado, se eu reiniciar o aplicativo depois de 5 são jogados, se eu não persistem esse número eu vou perder a conta.
Como Rafe já salientado, o maior desafio seria persistindo os eventos reais na Appender
, de modo que você vai saber que chegou o momento para acionar seu evento (por exemplo, escalar nível de log).
Por isso, proponho uma estratégia seguinte:
- Use a costume JDBCAppender. Ao contrário do empacotado com Log4j, este pode registrar exceções.
- Set-up um banco de dados integrado, como HSQLDB , e set-up uma base de dados com uma tabela para log de eventos . Ele resolve o problema persistência, como você pode usar SQL para encontrar tipos de eventos que ocorreram.
- Executar um segmento separado que monitora o banco de dados, e detecta desejado padrões de eventos.
- Use a LogManager para o acesso desejado registador s e definir o seu nível manualmente .