【问题标题】:log4net - logging to database tablelog4net - 记录到数据库表
【发布时间】:2018-07-24 21:30:54
【问题描述】:

我在 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' appender 部分,我正在使用我的数据库的连接字符串,日志将写入其中,但我已经在 'web.config' 中使用相同的连接字符串来获取数据并在 UI 上填充。

  • 如何将 web.config 中指定的相同连接字符串用于 使用 log4net 将数据记录到表中,而不在这里再次使用它 'log4net.config'。
  • 当我将不同的参数记录到文件中时,例如时间, 用户名、方法和堆栈跟踪;所有日志级别(信息、警告、
    错误)记录完整的参数,我不感兴趣。如何
    仅记录时间、用户名、INFO 级别和时间下的方法、用户名、
    方法,WARN/错误级别下的stacktrace

向项目添加了一个新的 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
堆栈跟踪: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 将数据记录到文件中,没有 记录到数据库表。

【问题讨论】:

    标签: c# asp.net-mvc log4net


    【解决方案1】:

    如果问题出在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>
    

    如果有任何异常,您将在日志文件中找到它。您已经将缓冲区大小设置为 1,这将直接刷新每条消息。

    more on Log4net Troubleshooting

    【讨论】:

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