简体   繁体   English

首先配置log4net Entity Framework数据库

[英]Configure log4net Entity Framework database-first

I am trying to implement log4net in a project using Entity Framework 6.0 with a database-first approach. 我正在尝试使用Entity Framework 6.0和数据库优先方法在项目中实现log4net。 I can log to a file and I could create a separate connection string using ADO but I want to use the Entity Framework context. 我可以登录到一个文件,我可以使用ADO创建一个单独的连接字符串,但我想使用Entity Framework上下文。 Does anyone know of any websites offering information on how to achieve this? 有谁知道任何网站提供有关如何实现这一目标的信息?

Here is my current config to log to a file: 这是我当前用于登录文件的配置:

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="c:\logs\webAApp.log"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="2" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Here's my new configuration: 这是我的新配置:

<configSections>
<section name="log4net" ype="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender" />
    </root>
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="server=pcrcrm.database.windows.net; uid=pcrdevadmin; pwd=Priv@te1; database=CRM-dev" />
      <commandText value="INSERT INTO [dbo].[ERROR_LOGGING] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception"/>
        <dbType value="String"/>
        <size value="2000"/>
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>

This is how you can do it 这就是你如何做到的

static void Main()
{
     XmlConfigurator.Configure();
     SetupLog4Net();
}

private static void SetupLog4Net()
{
    Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
    if(hierarchy != null && hierarchy.Configured)
    {
        foreach(IAppender appender in hierarchy.GetAppenders())
        {
           if(appender is AdoNetAppender)
           {
               var adoNetAppender = (AdoNetAppender)appender;
               adoNetAppender.ConnectionString = dbContext.Database.Connection.ConnectionString;
               adoNetAppender.ActivateOptions();
           }
        }
    }
}

Hope this helps. 希望这可以帮助。

First, create a log class. 首先,创建一个日志类。

public class DatabaseLogger
{
    readonly static log4net.ILog logger = log4net.LogManager.GetLogger("ADONetAppender");

    public static void LogDebug(string message)
    {
        logger.Debug(message);
    }
}

Create a new context class that inherits from the EF Context and inside the constructor set the property on the database log to an instance of the debugger class above. 创建一个继承自EF Context的新上下文类,并在构造函数内部将数据库日志中的属性设置为上面调试器类的实例。

public partial class InheritedContext : DbContext
{
    public InheritedContext() :
        base("DatabaseConnectionString")
    {
        Database.Log = DatabaseLogger.LogDebug;
        this.Configuration.LazyLoadingEnabled = false;
    }

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

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