如何在ASP.NET中启用/禁用日志记录

3
我正在尝试在我的ASP.NET网站中创建一个设置,允许我在应用程序运行时的任何时刻启用/禁用日志记录。我想有些人已经做过这样的事情。
以下是我尝试做的要点:
if(ShouldBeLogging)
logger.Info("helloooooo there");

那么,如何设置布尔值ShouldBeLogging,以便能够在网站运行时随时打开/关闭,而不会有任何严重的性能影响(考虑到它将经常被访问)?

我在考虑是否可以在web.config中加入一些内容,但是如果我想要打开它,那么更改可能会导致用户会话被断开吗?

谢谢!


关于最后一点 - 这取决于您使用的会话存储机制。如果您使用InProc(会话数据存储在内存中),那么是的。如果您使用更持久的东西,比如SQL数据库来存储会话数据,那么所有现有用户的会话将在更改web.config引起的应用程序域重启后仍然存在。 - Tomas
3个回答

2
我决定使用支持这种功能的log4net。你可以在assemblyinfo.cs文件中添加以下行:
```csharp [assembly: log4net.Config.XmlConfigurator(Watch = true)] ```
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "config\\log4net.config", Watch = true)]

设置监听配置文件的变化,然后您可以在程序执行期间的任何时候设置配置XML中的级别节点,以便打开/关闭日志记录,只要您在代码中使用以下检查:

if(log.IsDebugEnabled)
    log.Debug("write a debug message to the logger");

请参见http://logging.apache.org/log4net/release/manual/internals.html获取更多信息。

0
是的,对web.config进行更改会导致应用程序重新启动,并且取决于你的会话存储方式,会话会丢失。
布尔检查的性能开销很小,但在维护方面可能会成为一个噩梦。
为什么不直接使用已经可外部配置的企业库日志应用程序块呢?你可以参考这里在记录日志之前检查过滤器状态来实现你想要做的事情。
如果你真的决定通过if检查来切换日志记录,一个简单的伪解决方案是在你的web.config appSettings中添加一个值。
 <appSettings>
  <add key="DiagnosticLogging" value="true" />
</appSettings>

在你的全局页面中,加入如下代码: 公共静态只读布尔型LoggingEnabled { get; }
  Application_Start(..){
         string log = ConfigurationSettings.AppSettings["DiagnosticLogging"];
         LoggingEnabled  = false;
         if(!string.IsNullOrEmpty(log)){
             if(!boolean.TryParse(out LoggingEnabled )){
                   //bad application setting.. handle
              }   
         }      
  }

0

内置的诊断/跟踪可能是最适合您需求的,即查看http://www.beansoftware.com/ASP.NET-Tutorials/Tracing-ASP.NET.aspx

web.config 的示例:

<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="false" />
        <authentication mode="Windows" />
      <trace enabled ="true" pageOutput ="false" requestLimit ="20" traceMode ="SortByTime " /> 


</system.web>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接