【发布时间】:2012-06-13 13:49:39
【问题描述】:
在编写代码时,我经常在代码中放置调试消息。调试消息由 logger 类处理,该类在调试模式下将消息输出到文件并在发布模式下丢弃它们。
看起来有点像这样:
class Logger : IDisposable
{
private StreamWriter m_Logger = null;
public void Start(string logFile)
{
m_Logger = new StreamWriter(logFile);
m_Logger.AutoFlush = true;
}
public void Dispose()
{
if (m_Logger != null) m_Logger.Dispose();
}
public void WriteLine(string message)
{
if (m_Logger != null) m_Logger.WriteLine(message);
}
}
一个实例在启动时创建,可以从Program 类访问。然后我像这样检查调试:
#if DEBUG
Program.Log.Start("app.log");
#endif
这很好用,因为它在调试模式下转储调试信息,而不是在发布模式下。但是,如果我通过诸如strings 之类的实用程序运行发布可执行文件,我仍然可以看到调试字符串。我宁愿将它们完全排除在发布版本之外,以帮助防止逆向工程。
到目前为止,我发现的唯一解决方案是将所有调试消息包装在预处理器条件中:
// < some code here >
#if DEBUG
Program.Log.WriteLine("Some debug message.");
#endif
// < more code here >
这是相当乏味和丑陋的。我的第一个想法是使用某种预处理器宏,但 C# 不支持它们。有没有比我现在使用的更优雅的解决方案?
【问题讨论】:
-
我不确定这是否是您要查找的内容,但也许您可以使用 a conditional DEBUG attribute 标记记录器中的方法?
-
你真的需要看看 log4net。
-
@JeremyHolovacs 我以前用过 log4net,但是这个项目太小了,不能保证外部库。
标签: c# logging c-preprocessor