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:

  1. faz algo como isso já existe?

  2. É um Appender a classe certa para implementar esse comportamento?

  3. 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.

Foi útil?

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:

  1. Use a costume JDBCAppender. Ao contrário do empacotado com Log4j, este pode registrar exceções.
  2. 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.
  3. Executar um segmento separado que monitora o banco de dados, e detecta desejado padrões de eventos.
  4. Use a LogManager para o acesso desejado registador s e definir o seu nível manualmente .
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top