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

本文关键字:日志 对象 | 更新日期: 2023-09-27 18:26:11

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

我想将所有日志消息打印到同一Logger对象(用于处理所有文件打开/关闭)。

更准确地说:这与日志类本身无关。更多的是关于如何创建一个在我的应用程序中的所有其他对象/类中都可用的单个日志记录对象。以一种有效的方式(不将我的记录器作为参数传递给所有新创建的对象)。

最好的方法是什么?

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

您可以使用Singleton对象,

请参阅此处的示例实现

我会创建一个带有静态方法的类来处理所有日志记录。

然后可以从任何地方调用它,并提供一个要维护的类。

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

我建议,无论您是使用已经存在的库还是编写自己的库,都应该在主应用程序的单独应用程序进程中运行它,尽管它可以由您自己的应用程序启动,并向它发送要记录的数据。

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

这完全取决于你想要它的真正用途,如果它只用于记录异常,那么我会有一个应用程序范围的异常处理程序(取决于什么类型的应用程序),然后从那里进行日志记录。然而,我认为你正在寻找一种从应用程序中的任何地方记录任何内容的机制,有很多库可以做到这一点,但如果你想自己滚动,你可以做一些事情,比如:

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