Як мені ввійти в C #, не використовуючи сторонні бібліотеки? [зачинено]


92

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

Тому я хотів би зробити щось на зразок відлуння DOS до файлу. Який найефективніший спосіб це зробити?

Чи є спосіб реєструвати необроблені винятки, зареєстровані без використання зовнішньої структури?


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
вам слід використовувати usingфайл у форматі, хоча, оскільки він є локальним, метод все одно скоро буде розпоряджений.
markmnl

19
Також майте на увазі, що коли file.WriteLine(lines);видається виняток, код ніколи не потрапить file.Close();. Використання using- це еквівалент для try { // using block } finally { // Dispose }. Це означає, що об'єкт буде утилізований, навіть якщо код всередині usingблоку видасть виняток,
Мемет Олсен,

6
Що робити, якщо цей метод буде викликаний ще раз до завершення реєстрації? Ви отримаєте помилку - процес не може отримати доступ до файлу 'C: \ test.txt', оскільки він використовується іншим процесом. Хтось знає про цю проблему?
Майк Спортсмен

23

Я б не хотів використовувати будь-які зовнішні фреймворки, такі як log4j.net.

Чому? Log4net, мабуть, відповідав би більшості ваших вимог. Наприклад, перевірте цей клас: RollingFileAppender .

Log4net добре задокументований, і в Інтернеті є тисячі ресурсів та випадків використання.


3
причина в тому, що я ніколи не використовував жодних зовнішніх бібліотек у .net, тому спочатку мені потрібно навчитися це робити;)
IAdapter

4
Просто додайте посилання на свій проект і розмістіть конфігурацію xml - це дуже просто. Підручник Google для log4net і виберіть найкращий для вас.
empi

23
Використовуйте Nuget. Користування зовнішніми бібліотеками стане
легким

36
Чому так багато голосів? У запитанні двічі зазначається, що OP не хоче використовувати зовнішній фреймворк і прямо згадує про відсутність Log4net. Напевно, це повинен бути коментар, а не відповідь?
RyanfaeScotland

9
@RyanfaeScotland Ви маєте рацію, можливо, це не підійде OP, але, будь ласка, не забувайте, що це загальнодоступний сайт. Оскільки в заголовку Питання вказано лише "Як увійти в систему c #", також такі люди, як я, які добре користуються будь-якою бібліотекою, опиняться тут і знайдуть цю відповідь корисною. Насправді цей потік був першим результатом, коли я погуглив для "c # logging".
swenzel

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
Яка найкраща практика використовувати один і той же EventLog у різних класах? Передати його як параметр у конструкторі? Статичний доступ до нього з якогось однокласного класу? Або щось краще?
dpelisek

15

Якщо ви шукаєте справжній простий спосіб входу, ви можете скористатися цим одним вкладишем. Якщо файл не існує, він створюється.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");

Проблема цього рішення полягає в тому, що воно додає операцію вводу-виводу. Тому використовувати його не рекомендується для реєстрації пакетних операцій алгоритму
Рамі Ямпольський,

@RamiYampolsky, я не розумію, що ти маєш на увазі.
dan-gph

@ dan-gph Якщо ви реалізуєте якийсь код, який виконує багато процесорних операцій, у разі входу під час цього коду ви "витрачаєте" деякий час на реєстрацію, а не на власний алгоритм, який ви намагаєтесь реалізувати. Тож ви віддаєте перевагу «витрачати» якомога коротший час. Виконання операцій вводу-виводу, як у прикладі вище, дійсно тривале, тому, якщо у вашому коді багато команд реєстрації, це може зробити все ваше виконання приблизно в 1000 разів повільнішим!
Рамі Ямпольський

@RamiYampolsky, я щойно зробив цей цикл коду 100 000 разів, і це зайняло 10 секунд. Отже, це 10000 записів журналу в секунду, що становить 0,01 мікросекунд на запис. Якщо ви записали 10 речей за 1 секунду, це займе 0,1 мікросекунди. Так що ні, це зовсім не накладні витрати.
dan-gph

@ dan-gph Моя відповідь пов'язана з різними варіантами використання. Спробуйте зробити цикл 100 000 разів, що робить певний розрахунок для простоти, просто зробіть sum + = i, а потім зробіть журнал. Спробуйте з журналом і без нього
Рамі Ямпольський

7

Раніше я писав власний журнал помилок, поки не виявив ELMAH . Я ніколи не міг отримати частину електронної пошти настільки ідеально, як це робить ELMAH.


Я розгляну це, для моїх міркувань, будь ласка, перевірте коментар моєї емпі.
IAdapter

ELMAH настільки прямий, що навіть не смішно, ви буквально можете залишити його, додавши кілька рядків до своєї веб-конфігурації, і він працює.
jonezy

Крім того, з точки зору ваших вимог знати, коли ваш додаток збирається / почнеться підірвати, я вважаю, що elmah краща за більшість інших завдяки своїй здатності надсилати електронні листи, тому, поки сервер працює, ви отримуватимете повідомлення про помилки від ельма.
jonezy

6

Якщо ви хочете бути поруч із .NET, перегляньте Блок застосунків журналу Enterprise Library . Подивіться сюди . Або для швидкого підручника перевірте це . Я використовував Блок програми перевірки з Бібліотеки підприємства, і це дійсно відповідає моїм потребам і дуже легко "успадкувати" (встановити його та відновити!) У вашому проекті.


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ɔɯǝɹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.