在J2EE应用程序(例如在WebSphere中运行的应用程序)中,当我使用System.out.println()时,我的文本将转换为标准输出,由WebSphere管理控制台映射到一个文件。

在ASP中。NET应用程序(像一个运行在IIS), Console.WriteLine()的输出去哪里?IIS进程必须有一个stdin, stdout和stderr;但是stdout映射到/dev/null的Windows版本还是我在这里错过了一个关键的概念?

我不是问我是否应该在那里记录日志(我使用log4net),而是问输出到哪里?我最好的信息来自于这个讨论,他们说Console. setout()可以改变TextWriter,但它仍然没有回答控制台的初始值是什么,或者如何在配置/运行时代码之外设置它的问题。


当前回答

默认情况下没有控制台监听。在调试模式下运行会附加一个控制台,但在生产环境中,正如您所怀疑的那样,消息不会去任何地方,因为没有任何东西在监听。

其他回答

如果你碰巧在ASP.net项目中使用NLog,你可以添加一个调试器目标:

<targets>
    <target name="debugger" xsi:type="Debugger"
            layout="${date:format=HH\:mm\:ss}|${pad:padding=5:inner=${level:uppercase=true}}|${message} "/>

并将您想要的级别的日志写入此目标:

<rules>
    <logger name="*" minlevel="Trace" writeTo="debugger" />

现在你的控制台输出就像在VS的“输出”窗口中的Jetty一样,并确保你运行在调试模式(F5)。

默认情况下没有控制台监听。在调试模式下运行会附加一个控制台,但在生产环境中,正如您所怀疑的那样,消息不会去任何地方,因为没有任何东西在监听。

通过尝试将DataContext的Log输出更改为输出窗口,我发现了这个问题。所以对于其他想做同样事情的人,我所做的就是创建这个:

class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

之后:dc. log = new DebugTextWriter(),我可以在输出窗口中看到所有的查询(dc是DataContext)。

看看这个,了解更多信息:http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

如果你看一下。net Reflector中的Console类,你会发现如果一个进程没有一个相关的控制台,Console。外出控制台。错误是由流支持的。Null(包装在TextWriter中),这是Stream的一个虚拟实现,基本上忽略所有输入,并且不提供输出。

因此,它在概念上等同于/dev/null,但实现更加简化:null设备没有实际的I/O发生。

此外,除了调用SetOut之外,没有办法配置默认值。

更新2020-11-02:由于这个答案在2020年仍在收集选票,可能应该注意的是,在ASP。NET Core,通常附带一个控制台。您可以配置ASP。NET Core IIS模块通过stdoutLogEnabled和stdoutLogFile设置将所有stdout和stderr输出重定向到日志文件:

<system.webServer>
  <aspNetCore processPath="dotnet"
              arguments=".\MyApp.dll"
              hostingModel="inprocess"
              stdoutLogEnabled="true"
              stdoutLogFile=".\logs\stdout" />
<system.webServer>

当提到IISExpress时,每个人都感到困惑。没有什么可以读取控制台消息。例如,在ASPCORE MVC应用中,它使用appsettings进行配置。json,如果你正在使用IISExpress,它什么都不做。

现在你可以添加loggerFactory.AddDebug(LogLevel.Debug);在你的配置部分,它至少会显示你的日志在调试输出窗口。

好消息是CORE 2.0这一切都将改变:https://github.com/aspnet/Announcements/issues/255