Pergunta

Eu tenho um problema intermitente com algum código que grava em um log de eventos do Windows, usando C # e classe EventLog da Net.

Basicamente, esse código funciona no dia-a-dia perfeitamente, mas muito ocasionalmente, começamos recebendo erros como este:

"System.ArgumentException: Apenas o oito primeiros caracteres de um log personalizado nome são significativos, e há já outro log no sistema usando os oito primeiros caracteres o nome dado. Nome dado: 'Aplicação', nome do registo existente: 'Aplicação'. "

I pode identificar de outras informações nos registos do que a pilha de chamadas afetada é assim - Você pode ver claramente que eu sou na verdade tentando gravar um log de LB_Email existente (LogEmail é chamado pela primeira vez):

public static void LogEmail(string to, string type)
{
    string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
    Log(message, "LB_Email", EventLogEntryType.Information);
}

private static void Log(string message, string logName, EventLogEntryType type)
{
    using (EventLog aLog = new EventLog())
    {
        aLog.Source = logName;
        aLog.WriteEntry(message, type);
    }
}

Uma vez que os erros começar a ocorrer, parece que o acesso ao nosso eventlog LB_Email está bloqueado de alguma forma - exibindo as propriedades nas mostras eventlog particulares mais informações greyed-out e imutável, e outros processos parecem estar impedido de registro para que o log também. No entanto, eu estou vendo o erro (que usa o mesmo método Log acima) através de um try-catch que os logs para um log 'LB_Error', e que continua a funcionar como esperado.

Eu estou chamando este código a partir de uma aplicação multi-threaded, mas eu tenho sido incapaz de identificar se o código acima é thread-safe ou não.

Posso também confirmar que o log em questão está funcionando novamente bem depois de matar e reiniciar o processo ... e tinha configurações adequadas para as entradas de reutilização quando ficou cheio ... embora eu não acho que foi a questão .

Eu adoraria ouvir seus pensamentos e sugestões.

Foi útil?

Solução

O href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx" rel="nofollow noreferrer"> documentação declara que:

Você só pode usar a Fonte de gravação a um log de cada vez

Então, eu suspeito que este problema é causado por seu aplicativo de vários segmentos chamando o método Log mais que uma vez em um determinado momento e para a mesma fonte.

Eu sugiro que, em vez de uma classe estática (ou métodos), você usa uma única classe thread-safe para o registo destes eventos.

EDIT:

Jon Skeet tem um excelente artigo em singletons.

Se você não quiser implementar uma classe singleton você pode fazer algo como isto:

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }

Espero que isso resolve o seu problema.

Outras dicas

Graças Bruno,

Então, estou enganado em pensar que a instância EventLog no método Log é diferente da instância EventLog na mesma chamada de método em um segmento diferente? Ou eu sou só ficando confuso sobre instâncias de objetos dentro de um método estático?

OK, então eu tenho vários métodos de mensagens publicitárias para o método Log (...). Se eu me mudei o método Log em uma única classe, mudou os invólucros (LogEmail, LogXxxx, LogYyy etc, então eu poderia manter meus interfaces de Log.Zzzz o mesmo, mas alavancagem a segurança do singleton LogSingleton.Instance.Log (...) a partir dos registos atuais. ou porque eu quero escrever a diferentes registros, que cada um requer seu próprio LogSingletonXxx?

Você pode dizer que eu estou confuso :) Sim - Eu realmente aprecio algum código de sincronização:)

Nij

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