[英]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添加到我的項目中。
<?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中用於用戶活動登錄的好示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.