Como faço o log em C # sem usar bibliotecas de terceiros? [fechadas]

92

Gostaria de implementar o registro em meu aplicativo, mas prefiro não usar nenhuma estrutura externa como o log4net.

Então, eu gostaria de fazer algo como o eco do DOS para um arquivo. Qual é a maneira mais eficaz de fazer isso?

Existe uma maneira de registrar exceções não tratadas registradas sem usar uma estrutura externa?

IAdapter
fonte
1
Você pode usar o System.Diagnostics.TraceSource integrado . <br> Aqui está uma lista dos ouvintes de rastreamento integrados + FileLogTraceListener . Existem muitos manuais na web como este [ou este de Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa
2
Acho que a biblioteca corporativa é uma opção melhor do que a log4net.
faminto de
Se você está procurando apenas um registro de console simples, System.Diagnostics.Tracing é provavelmente para você. O Trace pode ser usado como o Console (Trace.WriteLine).
Paul

Respostas:

66
public void Logger(string lines)
{
  //Write the string to a file.append mode is enabled so that the log
  //lines get appended to  test.txt than wiping content and writing the log

  using(System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt", true))
  {
    file.WriteLine(lines);
  }
}

Para mais informações MSDN

Brandon
fonte
22
você deve usar um usingarquivo, embora, como é local, um método será descartado logo de qualquer maneira.
markmnl
19
Lembre-se também de que, ao file.WriteLine(lines);lançar uma exceção, o código nunca será atingido file.Close();. Fazendo uso de usingé equivalente a try { // using block } finally { // Dispose }. Isso significa que o objeto será descartado mesmo se o código dentro do usingbloco lançar uma exceção,
Memet Olsen
6
E se esse método for chamado novamente antes que o registro seja concluído? Você gerará um erro - O processo não pode acessar o arquivo 'C: \ test.txt' porque ele está sendo usado por outro processo. Alguém conhece esse problema?
Mike Sportsman
23

Eu prefiro não usar nenhuma estrutura externa como log4j.net.

Por quê? Log4net provavelmente atenderia à maioria de seus requisitos. Por exemplo, verifique esta classe: RollingFileAppender .

Log4net é bem documentado e existem milhares de recursos e casos de uso na web.

empi
fonte
3
o motivo é que nunca usei nenhuma biblioteca externa em .net, então primeiro preciso aprender como fazer isso;)
IAdapter de
4
Basta adicionar referência ao seu projeto e colocar alguma configuração xml - é realmente fácil. Tutorial do Google para log4net e escolha aquele que é melhor para você.
empi de
23
Use o Nuget. Usar bibliotecas externas vai se tornar uma brisa
heneryville
36
Por que tantos votos positivos? A questão afirma duas vezes que OP não deseja usar uma estrutura externa e menciona explicitamente não querer Log4net. Certamente isso deveria ser um comentário, não uma resposta?
RyanfaeScotland
9
@RyanfaeScotland Você está certo, talvez não seja adequado para o OP, mas não se esqueça de que este é um site público. Uma vez que o título da pergunta diz apenas "Como fazer login em c #", também pessoas como eu, que estão bem em usar qualquer biblioteca, vão chegar aqui e achar esta resposta útil. Na verdade, este tópico foi o primeiro resultado quando pesquisei "c # logging" no Google.
swenzel
18

Você pode gravar diretamente em um log de eventos. Verifique os seguintes links:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

E aqui está o exemplo do MSDN:

using System;
using System.Diagnostics;
using System.Threading;

class MySample{

    public static void Main(){

        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");

    }
}
šljaker
fonte
1
Qual é a melhor prática para usar o mesmo EventLog em classes diferentes? Passar como parâmetro no Construtor? Acessar estaticamente a partir de alguma classe de singleton? Ou algo melhor?
dpelisek
15

Se você está procurando uma maneira realmente simples de registrar, você pode usar este liner. Se o arquivo não existir, ele será criado.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
amor ao vivo
fonte
O problema com essa solução é que ela adiciona operação de E / S. Portanto, usá-lo não é recomendado para registrar operações de algoritmo em lote
Rami Yampolsky
@RamiYampolsky, não entendo o que você quer dizer.
dan-gph
@ dan-gph Se você implementar algum código que está fazendo muitas operações de CPU, no caso de log durante este código, você "perderá" algum tempo que é para log em vez do algoritmo real que você tenta implementar. Portanto, você prefere "desperdiçar" o menor tempo possível. Realizar a operação IO como no exemplo acima é muito longa, então se você tiver muitos comandos de registro em seu código, isso pode tornar toda a sua execução cerca de 1000 vezes mais lenta!
Rami Yampolsky
@RamiYampolsky, acabei de fazer esse loop de código 100.000 vezes e demorou 10s. Portanto, são 10.000 entradas de registro por segundo, o que é 0,01 microssegundos por entrada. Se você registrou 10 coisas em 1 segundo, levaria 0,1 microssegundos. Portanto, não, isso não é muito overhead.
dan-gph
@ dan-gph Minha resposta relacionada a diferentes casos de uso. Tente fazer o loop 100.000 vezes que faz alguns cálculos para simplificar, apenas faça sum + = i e faça o log. Experimente com e sem o log
Rami Yampolsky
7

Eu costumava escrever meu próprio registro de erros até descobrir o ELMAH . Eu nunca fui capaz de fazer a parte do e-mail tão perfeitamente quanto ELMAH faz.

jonezy
fonte
Vou dar uma olhada, para o meu raciocínio, por favor, verifique o comentário do meu empi.
IAdapter de
ELMAH é tão direto que nem é engraçado, você pode literalmente inseri-lo e adicionar algumas linhas à sua configuração da web e está funcionando.
jonezy de
Além disso, em termos de sua necessidade de saber quando seu aplicativo está prestes a / começando a explodir, acho que elmah é melhor do que a maioria dos outros por causa de sua capacidade de enviar e-mails, então, enquanto o servidor estiver ativo, você receberá e-mails de erro de elmah.
jonezy de
6

Se você quiser ficar perto do .NET, verifique o Enterprise Library Logging Application Block . Olhe aqui . Ou para um tutorial de início rápido, verifique isto . Eu usei o aplicativo de validação Block da Biblioteca Corporativa e ele realmente atende às minhas necessidades e é muito fácil de "herdar" (instalar e refazer!) Em seu projeto.

Bernoulli IT
fonte
4

Se você deseja seu próprio registro de erros personalizado, pode facilmente escrever seu próprio código. Vou te dar um trecho de um dos meus projetos.

public void SaveLogFile(object method, Exception exception)
{
    string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
    try
    {
        //Opens a new file stream which allows asynchronous reading and writing
        using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
        {
            //Writes the method name with the exception and writes the exception underneath
            sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
            sw.WriteLine(exception.ToString()); sw.WriteLine("");
        }
    }
    catch (IOException)
    {
        if (!File.Exists(location + @"log.txt"))
        {
            File.Create(location + @"log.txt");
        }
    }
}

Então, para realmente gravar no log de erros, basta gravar ( qsendo a exceção capturada)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);
MisdartedPenguin
fonte
7
Você está ciente de que perderá a primeira entrada quando o arquivo ainda não existir?
oɔɯǝɹ