Pergunta

Eu estou usando log4net no meu projeto e não é um problema. A principal função do programa leva um longo tempo e eu usar o log para salvar informações sobre ele. Eu uso FileAppender para guardar o registo de arquivo.

A minha aplicação é na pasta compartilhada (local) e pode haver várias instâncias do aplicativo em execução de um caminho. Neste caso, eu poderia registrar informações apenas do primeiro programa, outros exemplos de meus aplicativos não foi possível fazer login info porque o arquivo de log está bloqueado .

Quando eu estou usando "log4net.Appender.FileAppender + MinimalLock" opção há casos de perda de informações. Nem todos os registros de ambas as instâncias são salvos em arquivo.

Como posso resolver este problema e informações de instâncias paralelas log? Também o que acontece com a degradação do desempenho quando eu usar a opção "MinimalLock"?

Graças. Esperança para sua ajuda.

Foi útil?

Solução

Basta incluir o ID de processo do aplicativo no nome do arquivo de log. Diferentes instâncias do seu aplicativo irá, em seguida, log para arquivos diferentes. Aqui está um exemplo:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Outras dicas

Eu acho que é uma situação típica quando solução de log centralizado é desejável. Em vez de se preocupar com arquivos e sofrem de gargalos de desempenho, prefiro bombear declarações log de forma assíncrona para algum serviço remoto, que vai cuidar de armazenar e manusear os logs. Ter um olhar para este agregador de log chamado logFaces , ele foi projetado com o objetivo de desacoplamento aplicações de gestão da sua Histórico. Ele deve funcionar com appender log4net UDP padrão e irá particionar seus dados de registro por aplicações, anfitriões, fios, etc .. enquanto permitindo que você crie arquivos de log qualquer momento quando realmente necessário.

Divulgação :. Eu sou o autor deste produto

Talvez você log para diferentes arquivos de cada instância? Caso contrário, você provavelmente precisará configurar um processo separado que se dedica à exploração madeireira. Cada instância do seu programa iria enviá-lo de mensagens de log lá e que iria cuidar de acrescentá-lo para o arquivo. Isto poderia ser conseguido usando SocketAppender, talvez. Além disso, acho que quebrar-se a saída do log em mandris usando RollingFileAppender é muito mais fácil de lidar.

Você pode criar um appender personalizada que abre o arquivo para escrever e depois fecha-lo. Deve acertar um arquivo bloqueado, pode fazer uma pausa e repetir um pequeno número de vezes.

No personalizado appender você também pode abrir o arquivo em modo de escrita compartilhada que iria permitir que vários escritores, mas isso não vai impedir que peças de linhas de registo de estar unidos.

Se você não está escrevendo um monte de dados, o / mecanismo próximo aberto, listadas acima, é provavelmente a sua melhor opção. Note, por causa da constante abertura e fechamento do arquivo, você pode ver um impacto de desempenho perceptível se você estiver registrando um monte de dados.

Um mecanismo mais complicado, mas que poderia fornecer um caminho de registro de alto desempenho: Escrever um serviço de registro que recebe linhas de registo via TCP ou UDP. O serviço seria responsável por buffer de dados e escrevê-lo em disco. Nós usamos esta abordagem no passado (não via Log4Net, mas como uma solução geral) para melhorar a eficiência log escrita.

Definitivamente considerar a criação de diferentes arquivos de log para cada processo, talvez com nomes de arquivos únicos gerados usando um timestamp.

Em vez de MinimalLock usando InterProcessLock pode reduzir a meter a perda de dados de múltiplos processos acessando único arquivo de log.

log4net.Appender.FileAppender+InterProcessLock
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top