簡體   English   中英

如何在MVC 4中通過Log4Net獲取用戶活動日志?

[英]How to get user activity logging by Log4Net in MVC 4?

我有一個MVC 4應用程序。我嘗試獲取用戶活動日志。

我看了這個樣本http://www.oakwoodinsights.com/adding-log4net-mvc-site/

但是我失敗了.SQL中的日志表是空的。

首先,我向項目添加了log4net.2.0.3軟件包。

我在SQL中有此表。

CREATE TABLE [dbo].[Log4Net] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Date] [datetime] NOT NULL ,
[Thread] [varchar] (255) NOT NULL ,
[Level] [varchar] (10) NOT NULL ,
[Logger] [varchar] (1000) NOT NULL ,
[Message] [varchar] (4000) NOT NULL ,
[Exception] [varchar] (4000) NOT NULL

) ON [PRIMARY]

我將Log4Net.config添加到我的項目中。

http://pastebin.com/RYpq3xTg

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
 <log4net>
<appender name="DbAppender" type="log4net.Appender.ADONetAppender">
  <bufferSize value="0" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="{auto}" />
  <commandText value="INSERT INTO Log4Net ([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="%t" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="10" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%p" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="1000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%c" />
    </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="4000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
</appender>

<root>
  <level value="INFO" />
  <appender-ref ref="RollingFileAppender" />
  <appender-ref ref="DbAppender" />
</root>

我在Controller中創建了一個靜態類

namespace MyApp.Controllers

{

public static class Log4NetManager
{


    public static void InitializeLog4Net()

    {
        XmlConfigurator.ConfigureAndWatch(new FileInfo(System.AppDomain.CurrentDomain.BaseDirectory + @"\Log4Net.config"));

        Hierarchy hier = log4net.LogManager.GetRepository() as Hierarchy;

        if (hier != null)
        {
            AdoNetAppender adoAppender = (from appender in hier.GetAppenders()
                                          where appender.Name.Equals("DbAppender", StringComparison.InvariantCultureIgnoreCase)
                                          select appender).FirstOrDefault() as AdoNetAppender;

            if (adoAppender != null && adoAppender.ConnectionString.Contains("{auto}"))
            {
                adoAppender.ConnectionString = ExtractConnectionStringFromEntityConnectionString(
                        GetEntitiyConnectionStringFromWebConfig());

                //refresh settings of appender
                adoAppender.ActivateOptions();

            }
        }

    }


    private static string GetEntitiyConnectionStringFromWebConfig()
    {
        return ConfigurationManager.ConnectionStrings["MemberEntities"].ConnectionString;

 //MemberEntities is like this in  Web.Config : http://pastebin.com/R9wCwRar


  }


    private static string ExtractConnectionStringFromEntityConnectionString(string entityConnectionString)
    {
        // create a entity connection string from the input
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(entityConnectionString);

        // read the db connectionstring
        return entityBuilder.ProviderConnectionString;
    }
   }
  }

在Global.asax.cs中稱為Log4NetManager.InitializeLog4Net()

protected void Application_Start()
    {

        Log4NetManager.InitializeLog4Net();
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

    }

最后登錄localhost:1235 / Sample

    public class SampleController : Controller

  {
    //
    // GET: /Sample/

    public ActionResult Index()
    {
        ILog logger = LogManager.GetLogger(typeof(SampleController));

        // get current user
        string user = HttpContext.User.Identity.ToString();

        logger.Debug("Debug messages are not recorded due to log level");
        logger.Info("User : "+" "+user.ToString()+" "+"was here");


        try
        {
            throw new InvalidOperationException();
        }

        catch (Exception ex)
        {

            logger.Error("An Error Happened! ", ex);

        }

        }

       return View();

        }

但是訪問localhost:1235 / Sample后,我的Log4Net表為空。

我的錯誤在哪里?

抱歉,我的錯誤是我在SQL中創建了日志表。

更改

Log

Log4Net

它正在工作。MVC4中用於用戶活動登錄的好示例。

如果log4net表為空,則可以檢查輸出窗口以獲取錯誤或警告。

在Log4Net上檢查輸出窗口是否有錯誤

暫無
暫無

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

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