2012-02-28 2 views
1

Я делаю аппликацию, которая имеет разные классы/объекты.C# писать журнал из разных объектов (классов)

Я хотел бы напечатать все сообщения журнала одному и тому же Logger-Object (который обрабатывает все файлы-открывать/закрывать).

Чтобы быть более точным: речь идет не о самом Logging-Class. Это больше о том, как создать один Singel Logging-Object, который доступен во всех других объектах/классах в моем приложении. Эффективным способом (не передавая мой регистратор как параметр ко всем новым созданным объектам).

Что было бы лучшим способом сделать это?

+0

проверить для Log4Net. – 2GDev

ответ

1

Вы можете использовать Singleton объект для этого,

См пример реализации here

+0

Это делает. Благодарю. – Stef

0

Я хотел бы создать один класс со статическим методом для обработки всех протоколирования.

Это можно затем вызвать из любого места и предоставить один класс для обслуживания.

/// <summary> 
/// Log class 
/// </summary> 
public class Log 
{ 
    /// <summary> 
    /// Writes an entry to the log 
    /// </summary> 
    /// <param name="message">The message to Write</param> 
    public static void WriteToLog(string message) 
    { 
     //Write your log code here 
    } 
} 


/// <summary> 
/// Test class 
/// </summary> 
public class Test() 
{ 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    public Test() 
    { 
     Log.WriteToLog("Test constructor called"); 
    } 
} 
0

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

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

+0

из proc не помогает в случае сбоя. в обоих случаях у вас есть лог-вызовы перед сбоем. – bryanmac

+0

действительно, хотя вы можете получить поврежденный файл журнала, если процесс замирает, и файл не был правильно закрыт. – ChrisBD

0

Это полностью зависит от того, что вы хотите от него на самом деле, если бы оно предназначалось только для регистрации исключений, тогда у меня был бы обработчик исключений приложений (в зависимости от того, какой тип приложения), а затем войдите оттуда. Однако я думаю, что вы после этого механизма регистрации ничего из любого места в приложении, есть много библиотек, которые делают это, но если вы хотите, чтобы свернуть свой собственный ваш может сделать что-то вроде:

public sealed class Logging 
{ 
    // Constructor is lazily called. 
    Logging() 
    { 
     //Setup reference to logging file. 
    } 

    public static Logging Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    /// <summary> 
    /// Writes debug information. 
    /// </summary> 
    /// <param name="text">The text to write.</param> 
    public void Debug(String text) 
    { 
     //Log to file 
    } 

    /// <summary> 
    /// Writes warning message. 
    /// </summary> 
    /// <param name="text">The message to write.</param> 
    public void Warn(String text) 
    { 
     //Log to file 
    } 

    /// <summary> 
    /// Writes error message. 
    /// </summary> 
    /// <param name="text">The message to write.</param> 
    public void Error(String text) 
    { 
     //Log to file 
    } 

    /// <summary> 
    /// Writes error message. 
    /// </summary> 
    /// <param name="text">The message to write.</param> 
    /// <param name="e">An inner exception.</param> 
    public void Error(String text, Exception e) 
    { 
     //Log to file 
    } 

    /// <summary> 
    /// Private class to hold the instance of the singleton. 
    /// </summary> 
    class Nested 
    { 
     static Nested() 
     { 

     } 

     internal static readonly Logging instance = new Logging(); 
    } 
} 

И затем использовать :

Logging.Instance.Debug("Hello World"); 
Смежные вопросы