c#从各种对象(类)写日志

时间:2012-02-28 11:55:33

标签: c# file logging

我正在做一个具有不同类/对象的应用程序。

我想将所有日志消息打印到同一个Logger-Object(处理 所有文件打开/关闭)。

更准确:它不是关于Logging-Class本身。它更多的是关于如何在我的应用程序中的所有其他对象/类中创建一个单一的Logging-Object。以有效的方式(不将我的记录器作为参数传递给所有新创建的对象)。

最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以使用 Singleton 对象

查看示例实现here

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

我建议您使用已经存在的库或编写自己的库,将其在单独的应用程序进程中运行到主应用程序,尽管它可以由您自己的应用程序启动,并将其发送到要记录的数据

这样做有几个原因,尤其是将数据实际写入日志文件不会对您自己的应用程序产生如此大的影响,但更重要的是,您更有可能记录异常导致应用程序崩溃,如果尚未完成日志记录数据,它将不会阻止应用程序关闭。

答案 3 :(得分: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");