Как мне войти в C # без использования сторонних библиотек? [закрыто]

92

Я хотел бы реализовать ведение журнала в своем приложении, но предпочел бы не использовать какие-либо внешние фреймворки, такие как log4net.

Итак, я хотел бы сделать что-то вроде эха DOS для файла. Как это сделать наиболее эффективно?

Есть ли способ регистрировать необработанные исключения, зарегистрированные без использования внешней структуры?

IAdapter
источник
1
Вы можете использовать встроенный System.Diagnostics.TraceSource . <br> Вот список встроенных прослушивателей трассировки + FileLogTraceListener . В сети есть много подобных руководств [или этого Джеффа Этвуда] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa
2
Я считаю, что корпоративная библиотека лучше, чем log4net.
hungryMind
Если вы ищете только простое ведение журнала консоли, System.Diagnostics.Tracing, вероятно, для вас. Трассировку можно использовать как консоль (Trace.WriteLine).
Пол

Ответы:

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);
  }
}

Для получения дополнительной информации MSDN

Брэндон
источник
22
вы должны использовать usingon-файл, хотя, поскольку он является локальным для метода, в любом случае скоро будет обнаружен.
markmnl
19
Также имейте в виду, что при file.WriteLine(lines);возникновении исключения код никогда не сработает file.Close();. Использование usingэквивалентно для try { // using block } finally { // Dispose }. Это означает, что объект будет удален, даже если код внутри usingблока вызовет исключение,
Мемет Олсен,
6
Что, если этот метод будет вызван еще раз до завершения регистрации? Вы вызовете ошибку - процесс не может получить доступ к файлу «C: \ test.txt», поскольку он используется другим процессом. Кто-нибудь знает об этой проблеме?
Майк Спортсман,
23

Я бы предпочел не использовать какие-либо внешние фреймворки, такие как log4j.net.

Зачем? Log4net, вероятно, удовлетворит большинство ваших требований. Например, проверьте этот класс: RollingFileAppender .

Log4net хорошо документирован, и в сети есть тысячи ресурсов и вариантов использования.

empi
источник
3
причина в том, что я никогда не использовал какие-либо внешние библиотеки в .net, поэтому сначала мне нужно узнать, как это сделать;)
IAdapter
4
Просто добавьте ссылку на свой проект и разместите некоторую xml-конфигурацию - это действительно просто. Google для log4net и выберите тот, который вам больше всего подходит.
empi
23
Используйте Nuget. Использование внешних библиотек станет
проще простого
37
Почему так много голосов? В вопросе дважды указано, что OP не хочет использовать внешнюю структуру и явно упоминает, что не хочет Log4net. Неужели это должен быть комментарий, а не ответ?
RyanfaeScotland
9
@RyanfaeScotland Вы правы, возможно, это не подойдет OP, но, пожалуйста, не забывайте, что это общедоступный сайт. Поскольку в заголовке вопроса указано только «Как вести журнал в C #», то люди вроде меня, которые не против использовать любую библиотеку, попадут сюда и найдут этот ответ полезным. Фактически, этот поток был первым результатом, когда я искал в Google "ведение журнала c #".
swenzel 05
18

Вы можете писать прямо в журнал событий. Проверьте следующие ссылки:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

А вот образец из 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.");

    }
}
Шлякер
источник
1
Как лучше всего использовать один и тот же журнал событий в разных классах? Передать его как параметр в конструкторе? Доступ к нему статически из какого-то одноэлементного класса? Или что-нибудь лучше?
dpelisek
15

Если вы ищете действительно простой способ входа в систему, вы можете использовать этот лайнер. Если файл не существует, он создается.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
живи любя
источник
Проблема с этим решением в том, что оно добавляет операцию ввода-вывода. Поэтому использование его не рекомендуется для протоколирования операций пакетного алгоритма,
Рами Ямпольский,
@RamiYampolsky, я не понимаю, о чем вы.
dan-gph
@ dan-gph Если вы реализуете какой-то код, который выполняет много операций с ЦП, в случае ведения журнала во время этого кода вы «тратите» время на ведение журнала, а не на сам алгоритм, который вы пытаетесь реализовать. Таким образом, вы предпочитаете «тратить» как можно меньше времени. Выполнение операции ввода-вывода, как в приведенном выше примере, действительно долгое время, поэтому, если в вашем коде много команд записи в журнал, это может сделать все ваше выполнение примерно в 1000 раз медленнее!
Рами Ямпольски
@RamiYampolsky, я сделал этот цикл кода 100000 раз, и это заняло 10 секунд. Итак, это 10 000 записей журнала в секунду, что составляет 0,01 микросекунды на запись. Если вы зарегистрировали 10 вещей за 1 секунду, это займет 0,1 микросекунды. Так что нет, это совсем не накладные расходы.
dan-gph
@ dan-gph Мой ответ относится к другому варианту использования. Попробуйте выполнить цикл 100000 раз, который делает некоторые вычисления для простоты, просто выполните sum + = i, а затем выполните журнал. Попробуйте с журналом и без него
Рами Ямпольски
7

Раньше я вел собственный журнал ошибок, пока не обнаружил ELMAH . Мне никогда не удавалось так хорошо продумать электронную почту, как это делает ELMAH.

jonezy
источник
Я посмотрю на это, для моих рассуждений, пожалуйста, ознакомьтесь с моим комментарием empi.
IAdapter
ELMAH настолько прост, что даже не смешно, вы буквально можете добавить его, добавив несколько строк в свою веб-конфигурацию, и он работает.
jonezy
Также с точки зрения вашего требования знать, когда ваше приложение вот-вот / начнет взорваться, я считаю, что elmah лучше, чем большинство других, из-за его способности отправлять электронные письма, поэтому, пока сервер работает, вы будете получать сообщения об ошибках от Эльма.
jonezy
6

Если вы хотите оставаться рядом с .NET, ознакомьтесь с блоком приложения Enterprise Library Logging Application . Смотри сюда . Или, чтобы получить краткое руководство, проверьте это . Я использовал блок приложения Validation из корпоративной библиотеки, и он действительно соответствует моим потребностям, и его очень легко «унаследовать» (установить и изменить!) В вашем проекте.

Бернулли IT
источник
4

Если вам нужен собственный журнал ошибок, вы можете легко написать свой собственный код. Приведу отрывок из одного из своих проектов.

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");
        }
    }
}

Затем, чтобы на самом деле записать в журнал ошибок, просто напишите ( qбудучи пойманным исключением)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);
Пингвин
источник
7
Вы знаете, что пропустите первую запись, когда файл еще не существует?
oɔɯǝɹ