Pergunta

Eu estava tentando adicionar a data ao meu nome de arquivo de log e pude fazê -lo funcionar seguindo as poucas sugestões que encontrei no StackOverflow. Tudo funciona bem, mas por algum motivo, o primeiro arquivo sempre tem a data anexada duas vezes.

Por exemplo, em vez de log.2009-02-23.log, Eu recebo log.2009-02-23.Log.2009-02-23.Log.

Eu achei tão estranho e FYI, este é um código muito simples. Não é como se eu o tivesse em execução em um ambiente multithread.

Minha configuração log4net:

<log4net>
<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
    <file value="../../Logs/Mylog"/>
    <staticLogFileName value="false" />
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd.lo\g" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="MyLog"/>
</root>
</log4net>

Alguma idéia do porquê?

EDIT: Quero adicionar as informações sobre o ambiente em que estou testando isso.
- Asp.net
- .NET Framework 2.0
- Windows Server 2003 Pacote de serviço de 64 bits 2
- log4net 1.2.10

Foi útil?

Solução 2

É um problema de permissão. Pelo menos é o que está acontecendo comigo.

Eu sou novo em usar o log4net, então não sabia que ele tem um registro interno, mas eu o encontrei, então tentei me virar registro interno sobre. Eu não tinha muita certeza do que está dizendo, mas eis o que parece para mim que está fazendo: 1. Anexe a data ao nome do arquivo. 2. Tente acessar o arquivo para gravar (falha). 3. Anexe a data ao nome do arquivo novamente. 4. Acesse o arquivo com sucesso (que tem o nome de arquivo estranho agora)

Antes que eu saiba disso, eu estava no Google para a solução para esse problema com palavras-chave como o que tenho como título nesta pergunta do Stackoverflow. Não havia muita informação por aí. Eu encontrei talvez um cara que disse que isso acontece com algumas pessoas, mas nunca explicou por que nem a solução. Com essas novas informações (+a mensagem de erro interna do log4net), eu estava olhando para diferentes threads dos mecanismos de pesquisa. Com isso, achei dicas de que poderia ser um problema de permissão.

Parece que o aplicativo de escrita não tem permissão suficiente para a pasta Logs. A identidade padrão do aplicativo geralmente é Network_service. Depois de dar mais permissão (dei controle total, mas não sei qual é o mínimo para fazê -lo funcionar) para a pasta, funciona muito bem.

Se alguém puder explicar isso melhor do que eu, sinta -se à vontade para editar.

Outras dicas

Isso acontece se houver um problema em acessar o arquivo de log quando você inicializa o sistema de log. Isso pode acontecer se você inicializar o sistema de log duas vezes, se você executar seu programa enquanto outra cópia estiver executando e gravando no arquivo de log ou se estiver editando o arquivo de log em um editor de texto. Basicamente, tudo o que causa um bloqueio de gravação no arquivo de log quando o log4net init é executado.

Verifique seu código para obter chamadas duplicadas para o log4net init - talvez você esteja inicializando em um construtor em vez de no construtor estático de um singleton ou init global, por exemplo.

Isso também pode acontecer se você estiver em execução em uma configuração de 'jardim da web' e não incluir o PID no nome do arquivo, porque cada processo de servidor da web diferente tenta gravar no mesmo arquivo. Se estiver usando jardins da web e gravar em arquivos, adicione o PID ao padrão de nome do arquivo para que cada processo do servidor obtenha seu próprio arquivo.

Eu encontro o mesmo problema. Para mim, foi uma combinação de usar o RollingFileAppender para meus registros de teste e executar meus testes de NuNit com o Resharper.

Acontece que o Resharper usa dois processos para executar os testes:

2 TaskRunners

o que cria uma condição de corrida no arquivo de log.

Agora, se alterarmos o nome do arquivo de log para incluir o ID do processo:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="false"/>
  <datePattern value="_yyyy-MM-dd'.log'"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" />
  </layout>
</appender>

o problema está resolvido. Cada arquivo recebe seu próprio nome exclusivo:

Mylog.pid.5440_2010-10-13.Log
MyLog.pid.1496_2010-10-13.Log

Observe o uso de PatternString para 'tipo'.

Espero que ajude.

Como Olle apontou. Seu problema está relacionado ao ' g', que seu log4net está interpretando como outro DateFormat. Tente excluir o ".yyyy-mm-dd.lo g" e substituindo-o por "AAAA-MM-DD"

O ". .Log" não pertence ao DateFormat

Eu uso o seguinte:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>

Com isso eu recebo nomes de arquivos como: 2009.02.23.Log

tentar <datePattern value=".yyyy-MM-dd.lo\g" /> Eu não entendo para que serve o g.

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