【发布时间】:2016-12-16 20:14:54
【问题描述】:
我有一个记录器 API,可用于记录到文本。 记录器有一些属性,可用于记录事件类型(Info、Err 等)、源应用(app1、app2 等)和消息文本。
语法简单,运行良好:
Logger log = new Logger();
log.Write("Information", "SourceApplication", "Test text to log");
现在我正在考虑创建 2 个静态类,一个用于“通用日志记录”,另一个用于“调试日志记录”。目标是避免为每个模块利用率创建记录器对象的新实例。每个类都应该能够在不实例化的情况下使用这些对象(静态类应该自动处理)。
“调试日志” - 可以由解决方案中的任何项目使用,并且应该是单例。 要使用的呼叫者代码应该是:
LoggerDebug.Write("Debug", "Debugger", "Test text to log");
通用日志记录 - 供所有项目模块使用,但在每次使用后,静态类应处理 Logger 对象 要使用的呼叫者代码应该是:
LoggerDebug.Write("Information", "App1", "Test text to log");
我尝试从“Debug Logging”静态类开始,我读过 (http://csharpindepth.com/Articles/General/Singleton.aspx) 但我不确定这是否是正确的方法... 你能给我一些建议吗?
using System;
using System.Diagnostics;
using System.Collections.Generic;
namespace Common
{
public sealed class LoggerDebug
{
private static LoggerDebug instance = null;
private static readonly object padlock = new object();
private static Logger log;
static LoggerDebug Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new LoggerDebug();
}
return instance;
}
}
}
public LoggerDebug()
{
log = new Logger();
}
public static void Write(String EventType, string appSource, string text)
{
log.Write(EventType, appSource, string.Format("Test {0}", text));
}
}
}
调用者代码如下所示:
LoggerDebug.Write("Information", "App1", "Test text to log");
当我尝试运行应用程序时,它会崩溃:
“System.NullReferenceException”类型的未处理异常 发生在 Common.dll 附加信息:对象引用不 设置为对象的实例。
也就是说 ctor 没有实例化 log = new Logger();
所以我可以通过以下方式纠正这个问题:
private static Logger log = new Logger();
并评论 ctor 代码
public LoggerDebug()
{
//log = new Logger();
}
但我很困惑,不确定这是否是正确的方法,如何正确地做到这一点?
我可以使用任何示例吗?
【问题讨论】:
-
你的静态实例永远不会被调用。
-
只需在静态方法“Write”中创建新实例
-
扩展 RAZER 的观点 - LoggerDebug.Instance.Write("Information", "App1", "Test text to log");工作吗?
-
正如我所说,如果我将属性更改为
并注释 Constructor 的代码,代码可以正常工作,但正如我所说,我的问题是我不确定这是否是正确的方法...
标签: c# logging exception-handling