c # запись журнала из различных объектов (классов) - PullRequest
1 голос
/ 28 февраля 2012

Я делаю приложение, которое имеет разные классы / объекты.

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

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

Как лучше всего это сделать?

Ответы [ 4 ]

1 голос
/ 28 февраля 2012

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

См. Пример реализации здесь

0 голосов
/ 28 февраля 2012

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

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");
0 голосов
/ 28 февраля 2012

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

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

0 голосов
/ 28 февраля 2012

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

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

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