在ASP .NET MVC下如何做日志

一,首先先解决写到一般文件里的问题:

解决步骤:

1.首先下载个log4net.dll.并放到你的reference中

2.在AssemblyInfo.cs最下面加入一行

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)],这里log4net.config是你将要

放置一些配置的地方。这个文件放在项目的根目录下。内容为:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreHandlerSection"/>
  </configSections>
  <log4net>
    <appender name="console" type="log4net.Appender.ConsoleAppender"></appender>
    <root>
      <level value="WARN" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="Test">
      <level value="DEBUG"/>
    </logger>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
      <param name="File" value="D:/Documents and Settings/E518731/log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]/r/n"/>
        <param name="Footer" value="[Footer]/r/n"/>
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n"/>
      </layout>
    </appender>
  </log4net>
 
</configuration>

3.Controller中的代码如此写:

public class HomeController : Controller
    {
        log4net.ILog log = log4net.LogManager.GetLogger("Test");
        
        public ActionResult Index()
        {
            log.Error("haha");
            return View();
        }
    }

这样你就可以写log到某个file里面了.

 

 

 

二,解决写自定义log到数据库里面的问题

1.首先下载个log4net.dll.并放到你的reference中

2.在Global.asax的Application_Start方法中加入如下一行

log4net.Config.XmlConfigurator.Configure();

3.建立一个自定义的log对象

public class LogContent
{
    public string contents;
    public int userId;
}

4.在Web.config的configSections中加入如下一节

<section name="log4net"       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

5.在configSections节外面加入如下

<log4net>
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
          <bufferSize value="0" />
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionString value="server=ch71dtbfxt12x/SQLEXPRESS; uid=sa; pwd=password; database=ATMS" />
          <commandText value="INSERT INTO Logs ([createdAt],[contents],[userId],[severity]) VALUES 
           (@log_date,  @contents,@userId,@level)" />
          
          <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>            
          
          <parameter>
            <parameterName value="@contents" />
            <dbType value="String" />
            <size value="256" />
            <layout type="ATMS.ATMSWeb.Log4Net.MyLayout">
              <conversionPattern value="%Contents" />
            </layout>
          </parameter>
          
          <parameter>
            <parameterName value="@userId"/>
            <dbType value="Int32"/>
            <layout type="ATMS.ATMSWeb.Log4Net.MyLayout">
              <conversionPattern value="%UserId" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@level" />
            <dbType value="String" />
            <size value="256" />
            <layout type="log4net.Layout.PatternLayout" value="%level" />
          </parameter>
      </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender" />
    </root>
  </log4net>

6.新建一个文件,包含如下:

namespace ATMS.ATMSWeb.Log4Net
{
    public class MyLayout : PatternLayout   
    {   
        public MyLayout()   
        {
            this.AddConverter("Contents", typeof(ContentsPatternConverter));
            this.AddConverter("UserId", typeof(UserIdPatternConverter));  
        }   
    }
    public class ContentsPatternConverter : PatternLayoutConverter   
    {
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            LogContent logMessage = loggingEvent.MessageObject as LogContent;
            if (logMessage != null)
                writer.Write(logMessage.contents);
        }
    }
    public class UserIdPatternConverter : PatternLayoutConverter
    {
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            LogContent logMessage = loggingEvent.MessageObject as LogContent;
            if (logMessage != null)
                writer.Write(logMessage.userId);
        }
    }
}

7.记日志的时候,如下写法:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Error(new LogContent {contents="ss",userId=4 });

这下子你就可以把日至写到数据库表中了.

 

posted @ 2013-12-20 14:28  疯子艾云  阅读(354)  评论(0编辑  收藏  举报