我想设置一个调试标志,以便用“Log”.WriteLine替换“Console”.Writeline。 我不想写
if (debug)
Log.writeline("log");
else
Console.Writeline("log"); every time I want to log info.
类似于INFO.Writelline("log");
的东西,其中INFO可以由“Log”或“Console”替换,具体取决于全局变量集。
本来会使用条件宏,但C#不支持。
如果我遗失了什么,请告诉我。
答案 0 :(得分:4)
你有没有试过这样的事情:
#if (DEBUG)
Log.writeline("log");
#else
Console.Writeline("log");
#endif
答案 1 :(得分:3)
这样的东西?
#define MY_DEBUG //Note: this must be the first line in the file
public static class INFO
{
public static void WriteLine(string message)
{
#if (MY_DEBUG)
Log.writeline(message);
#else
Console.Writeline(message);
#endif
}
}
你只需要打电话
INFO.WriteLine("log message");
答案 2 :(得分:3)
不直接回答您的问题。但您可以添加自己的界面ILog
,并避免在任何地方if(debug)
条件。
public interface ILog
{
void WriteLine(string message);
}
然后像
那样实现它public class LogImpl : ILog
{
public void WriteLine(string message)
{
Log.WriteLine(...);
}
}
public class DebugImpl : ILog
{
public void WriteLine(string message)
{
Debug.WriteLine(...);
}
}
然后为方便起见,你可以有一个提供这个实例的静态类。
public static class Logger
{
public static ILog Instance = new DebugImpl();//Or LogImpl
}
然后你可以说
Logger.Instance.WriteLine(...);
优点是您可以在运行时在不同的实现之间切换。说Debug
,Console
,File
,Database
等等。
答案 3 :(得分:2)
您可以使用Log4Net之类的库并设置不同的 appenders ,一个用于控制台,另一个用于记录到文件/ sql服务器等。
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file-1.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %message%newline" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
通过执行此操作,您将看到它在本地运行时登录到控制台,并且在生产中运行时也会记录到文件,这将在同一行中完成...
log.info(...);