简体   繁体   English

log4net-记录到数据库表

[英]log4net - logging to database table

I'm using Log4net in ASP.Net MVC for logging to different output types (file & DB). 我在ASP.Net MVC中使用Log4net记录到不同的输出类型(文件和数据库)。 I'm able to log data to RollingFileAppender but not to AdoNetAppender 我能够将数据记录到RollingFileAppender但不能记录到AdoNetAppender

Added new log4net.config to project with file-appender section & DBLog-appender section 将新的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>

In 'DBLog' appender section, i'm using connection string of my DB to which logs would be written, but i'm already using same connection string in 'web.config' to fetch data and populate on UI. “ DBLog”附加程序部分中,我正在使用要写入日志的数据库连接字符串,但是我已经在“ web.config”中使用相同的连接字符串来获取数据并在UI上进行填充。

  • How to use the same connection string specified in web.config for logging data to table using log4net without using it here again in 'log4net.config'. 如何使用在web.config中指定的相同连接字符串使用log4net将数据记录到表中,而无需在“ log4net.config”中再次使用它。
  • As i'm logging different parameters to file such as time, userName, method and stacktrace; 当我将不同的参数记录到文件中时,例如时间,用户名,方法和堆栈跟踪; All log levels (Info, warn, 所有日志级别(信息,警告,
    error) log complete parameters, which i'm not interested in. How to 错误)记录完整的参数,我对此不感兴趣。
    log only time, userName, method under INFO level & time, userName, 仅记录时间,用户名,信息级别和时间下的方法,用户名,
    method, stacktrace under WARN/ Error level 方法,WARN /错误级别下的堆栈跟踪

Added a new log4netHelper.cs to project 向项目添加了一个新的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 is logging following RollingFileAppender正在记录以下内容

INFO 2018-07-23 19:27:06 PM –(null)– Index Action End method: LogMessage 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 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
type:PartialViewApplSol.App_Start.log4netHelper line: 19 类型:PartialViewApplSol.App_Start.log4netHelper行:19

  • How to get current caller method which is calling log4net.Message()? 如何获取正在调用log4net.Message()的当前调用方方法? It's always showing method names in 'log4netHelper.cs' (LogMessage/ LogError). 它总是在'log4netHelper.cs'(LogMessage / LogError)中显示方法名称。 MSDN says to use 'System.Runtime.CompilerServices.CallerMemberName' attribute, but how to incorporate this into my logic. MSDN表示使用“ System.Runtime.CompilerServices.CallerMemberName”属性,但如何将其纳入我的逻辑。

  • Current log4net.config have both RollingFileAppender & AdoNetAppender but only RollingFileAppender is logging data to file, nothing is logged to Database table. 当前的log4net.config同时具有RollingFileAppender和AdoNetAppender,但只有RollingFileAppender会将数据记录到文件中,而没有任何记录到数据库表中。

If the problem is in log4net, you can best enable log4net internal debugging: 如果问题出在log4net中,则最好启用log4net内部调试:

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

And write it to file: 并将其写入文件:

<configuration>
...

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

...
</configuration>

If there is any exception you will find it in the log file. 如果有任何异常,您将在日志文件中找到它。 You already have set the buffersize to 1, that will flush each message directly. 您已经将buffersize设置为1,它将直接刷新每条消息。

more on Log4net Troubleshooting 有关Log4net故障排除的更多信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM