public static void OverrideDiagnosticsLevel(DiagnosticsLevels newLevel){
     _overrideLevel = newLevel;
 }
 private static void AppendMessageToFile(Site site,HttpConnection conn,HttpRequest request, DiagnosticsLevels logLevel, string Message)
 {
     Monitor.Enter(_lock);
     _messages.Enqueue(_FormatDiagnosticsMessage(site,conn,request, logLevel, Message));
     Monitor.Exit(_lock);
 }
 //formats a diagnostics message using the appropriate date time format as well as site and log level information
 private static string _FormatDiagnosticsMessage(Site site,HttpConnection conn,HttpRequest request, DiagnosticsLevels logLevel, string Message)
 {
     string sfs = "UNKNOWN";
     if (request != null)
         sfs = "HttpRequest[" + request.ID.ToString() + "]";
     else if (conn != null)
         sfs = "HttpConnection[" + conn.ID.ToString() + "]";
     else if (BackgroundOperationRun.Current != null)
         sfs = "BackgroundRunThread[" + BackgroundOperationRun.Current.ID.ToString() + "][" + BackgroundOperationRun.Current.Call.type.FullName + "." + BackgroundOperationRun.Current.Call.Method.Name + "]";
     else
     {
         try
         {
             sfs = "Thread[" + Thread.CurrentThread.Name + "]";
         }
         catch (Exception e) { }
     }
     if (site != null)
     {
         if (Settings.UseServerNameInLogging)
         {
             if (site.ServerName != null)
                 return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|" + site.ServerName+"|"+sfs+"|" + Message;
             else if (conn!=null)
                 return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|" + conn.Listener.IP.ToString() + ":" + conn.Listener.Port.ToString() + "|" + sfs + "|" + Message;
             else
                 return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|" + site.ListenOn[0].Address.ToString() + ":" + site.ListenOn[0].Port.ToString() + "|" + sfs + "|" + Message;
         }else
             return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|" + sfs + "|" + Message;
     }
     else if (conn != null)
     {
         if (Settings.UseServerNameInLogging)
             return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|" + conn.Listener.IP.ToString() + ":" + conn.Listener.Port.ToString() + "|" + sfs + "|" + Message;
     }
     return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + logLevel.ToString() + "|null|" + sfs + "|" + Message;
 }
 /*
  * Called to log a message.  It checks if to check for site settings
  * for the log, or just general settings.  Once it has been determined if 
  * logging should occur, it then determines the type and either prints it
  * to the appropriate output, or it appends the message to the given queue asynchronously.
  */
 public static void LogMessage(DiagnosticsLevels logLevel, string Message)
 {
     DiagnosticsLevels lvl = DiagnosticsLevels.NONE;
     DiagnosticsOutputs opt = DiagnosticsOutputs.DEBUG;
     if (_overrideLevel.HasValue)
         lvl = _overrideLevel.Value;
     else if (Site.CurrentSite != null)
         lvl = Site.CurrentSite.DiagnosticsLevel;
     else
         lvl = Settings.DiagnosticsLevel;
     if (_overrideOutput.HasValue)
         opt = _overrideOutput.Value;
     else if (Site.CurrentSite != null)
         opt = Site.CurrentSite.DiagnosticsOutput;
     else
         opt = Settings.DiagnosticsOutput;
     if ((int)lvl >= (int)logLevel)
     {
         switch (opt)
         {
             case DiagnosticsOutputs.DEBUG:
                 System.Diagnostics.Debug.WriteLine(_FormatDiagnosticsMessage(Site.CurrentSite, HttpConnection.CurrentConnection,HttpRequest.CurrentRequest, logLevel, Message));
                 break;
             case DiagnosticsOutputs.CONSOLE:
                 Console.WriteLine(_FormatDiagnosticsMessage(Site.CurrentSite, HttpConnection.CurrentConnection,HttpRequest.CurrentRequest, logLevel, Message));
                 break;
             case DiagnosticsOutputs.FILE:
                 new delAppendMessageToFile(AppendMessageToFile).BeginInvoke(Site.CurrentSite, HttpConnection.CurrentConnection,HttpRequest.CurrentRequest, logLevel, Message, new AsyncCallback(QueueMessageComplete), null);
                 break;
             case DiagnosticsOutputs.SOCKET:
                 _sockLog.SendTo(System.Text.ASCIIEncoding.ASCII.GetBytes(_FormatDiagnosticsMessage(Site.CurrentSite, HttpConnection.CurrentConnection,HttpRequest.CurrentRequest, logLevel, Message) + "\n\n"), Site.CurrentSite.RemoteLoggingServer);
                 break;
         }
     }
 }