簡體   English   中英

log4net-記錄到數據庫表

[英]log4net - logging to database table

我在ASP.Net MVC中使用Log4net記錄到不同的輸出類型(文件和數據庫)。 我能夠將數據記錄到RollingFileAppender但不能記錄到AdoNetAppender

將新的log4net.config添加到帶有file-appender sectionDBLog-appender section

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="file" />
    <appender-ref ref="DBLog" />
  </root>
  <!--Rolling File Appender-->
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Trinadh\Dot.Net\Web Applications\ASP.NetMVC\PartialViewApplSol\PartialViewApplSol\myapp.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-7p%d{yyyy-MM-dd HH:mm:ss tt} –%X{user}– %m method:%method %n stacktrace:%stacktrace{5} %n %logger %n type:%type %n line: %line %n" />
    </layout>
  </appender>
<!--Database Table Appender-->
  <appender name="DBLog" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="Server=DBServer;Database=DemoDB;integrated security=false;persist security info=True;User ID=sysAdmin;Password=XyzAbc;" />
    <commandText value="INSERT INTO dbo.Log4net_Log ([Date],[Level],[Logger],[User],[Message],[Exception])
 VALUES (@log_date, @log_level, @logger, @user, @message, @exception)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%p" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%c" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@user" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%X{user}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
</log4net>

“ DBLog”附加程序部分中,我正在使用要寫入日志的數據庫連接字符串,但是我已經在“ web.config”中使用相同的連接字符串來獲取數據並在UI上進行填充。

  • 如何使用在web.config中指定的相同連接字符串使用log4net將數據記錄到表中,而無需在“ log4net.config”中再次使用它。
  • 當我將不同的參數記錄到文件中時,例如時間,用戶名,方法和堆棧跟蹤; 所有日志級別(信息,警告,
    錯誤)記錄完整的參數,我對此不感興趣。
    僅記錄時間,用戶名,信息級別和時間下的方法,用戶名,
    方法,WARN /錯誤級別下的堆棧跟蹤

向項目添加了一個新的log4netHelper.cs

public class log4netHelper  
{    
    private static readonly ILog log4Net = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);    
    public log4netHelper()    
    {    
        if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)    
            MDC.Set("user", HttpContext.Current.User.Identity.Name);    
    }    
    public static void LogMessage(string message)    
    {    
        log4Net.Info(message);    
    }    

    public static void LogError(string message, Exception ex)    
    {    
        log4Net.Error(message, ex);    
    }    
}

RollingFileAppender正在記錄以下內容

INFO 2018-07-23 19:27:06 PM –(null)–索引操作結束方法: LogMessage
stacktrace:System.Threading.Tasks.Task.ExecutionContextCallback> System.Threading.Tasks.Task.Execute> System.Threading.Tasks.Task.InnerInvoke> PartialViewApplSol.Controllers.HomeController + <> c.b__3_1> PartialViewApplSol.App_Start.log4netHelper.LogMessage
PartialViewApplSol.App_Start.log4netHelper
類型:PartialViewApplSol.App_Start.log4netHelper行:19

  • 如何獲取正在調用log4net.Message()的當前調用方方法? 它總是在'log4netHelper.cs'(LogMessage / LogError)中顯示方法名稱。 MSDN表示使用“ System.Runtime.CompilerServices.CallerMemberName”屬性,但如何將其納入我的邏輯。

  • 當前的log4net.config同時具有RollingFileAppender和AdoNetAppender,但只有RollingFileAppender會將數據記錄到文件中,而沒有任何記錄到數據庫表中。

如果問題出在log4net中,則最好啟用log4net內部調試:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>

並將其寫入文件:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

如果有任何異常,您將在日志文件中找到它。 您已經將buffersize設置為1,它將直接刷新每條消息。

有關Log4net故障排除的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM