【问题标题】:The log4net syslog appender have some problems with new lineslog4net syslog appender 有一些新行的问题
【发布时间】:2016-06-28 05:36:27
【问题描述】:

我有这个附加程序:

 <appender name="Syslog" type="log4net.Appender.RemoteSyslogAppender">
    <param name="RemoteAddress" value="**.***.***.**" />
    <param name="RemotePort" value="514" />

    <facility value="Local6" />
    <identity value="Widgets" />

    <layout type="log4net.Layout.PatternLayout">
         <conversionPattern value="[%date] [%property{NDC}] [%-5level] [%logger] [%property{url}] [%message] [%thread] %newline" />
      </layout>
  </appender>

appender 将 stacktrace 写为 new 日志条目:

Jun 19 20:06:33 adminclou6PBAYR Widgets: [2016-06-19 20:06:21,156] [0JUK68M] [ERROR] [Widgets.Web.HandleWebErrorAttribute] [~/Customer/RegisterWithEmailForm] [The given key was not present in the dictionary.] [16]
Jun 19 20:06:33 adminclou6PBAYR Widgets: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at Widgets.Web.LabelExtensions.TranslatedLabelFor[TModel,TValue](HtmlHelper`1 html, Expression`1 expression, IDictionary`2 htmlAttributes)
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at ASP._Page_Views_Customer_RegisterWithEmailForm_cshtml.Execute() in c:\inetpub\wwwroot\HL\Widgets\Views\Customer\RegisterWithEmailForm.cshtml:line 4
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
Jun 19 20:06:33 adminclou6PBAYR Widgets:    at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)

RollingFileAppender BTW 很好。

  1. 如何防止堆栈跟踪一次又一次地被写入新的日志条目?
  2. RollingFileAppenderRemoteSyslogAppender 中,我没有要求编写堆栈跟踪,正如您在conversionPattern 中看到的那样,但附加程序仍会编写它。

谢谢

【问题讨论】:

    标签: log4net syslog


    【解决方案1】:

    您的消息包含换行符,这些换行符在remotesysappender code (line 396): 中作为单独的行发送

    373                 while (i < message.Length) 
    374                 { 
    375                     // Clear StringBuilder 
    376                     builder.Length = 0; 
    377  
    378                     // Write priority 
    379                     builder.Append('<'); 
    380                     builder.Append(priority); 
    381                     builder.Append('>'); 
    382  
    383                     // Write identity 
    384                     builder.Append(identity); 
    385                     builder.Append(": "); 
    386  
    387                     for (; i < message.Length; i++) 
    388                     { 
    389                         c = message[i]; 
    390  
    391                         // Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3 
    392                         if (((int)c >= 32) && ((int)c <= 126)) 
    393                         { 
    394                             builder.Append(c); 
    395                         } 
    396                         // If character is newline, break and send the current line 
    397                         else if ((c == '\r') || (c == '\n')) 
    398                         { 
    399                             // Check the next character to handle \r\n or \n\r 
    400                             if ((message.Length > i + 1) && ((message[i + 1] == '\r') || (message[i + 1] == '\n'))) 
    401                             { 
    402                                 i++; 
    403                             } 
    404                             i++; 
    405                             break; 
    406                         } 
    407                     } 
    408  
    409                     // Grab as a byte array 
    410                     buffer = this.Encoding.GetBytes(builder.ToString()); 
    411  
    412                     this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint); 
    413                 } 
    

    您可以通过不在您的消息(转换器)中添加 \r 或 \n 来防止这种情况发生。

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多