Log4Net添加自定义日志信息
Log4Net添加自定义日志信息
一、 前言
该文章是针对在Log4Net中添加自定义日志信息。我们在写日志的时候并不是只写消息(Message),有些情况需要记录自定义的日志信息等。下面将说明在Log4Net中增加自定义字段UserName(用户名),Category(类别)这两个字段。
二、     建立数据库
 CREATE TABLE [dbo].[Log] (
CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL ,
    [Id] [int] IDENTITY (1, 1) NOT NULL , [Date] [datetime] NOT NULL ,
    [Date] [datetime] NOT NULL , [Thread] [varchar] (255) NOT NULL ,
    [Thread] [varchar] (255) NOT NULL , [Level] [varchar] (50) NOT NULL ,
    [Level] [varchar] (50) NOT NULL , [Logger] [varchar] (255) NOT NULL ,
    [Logger] [varchar] (255) NOT NULL , [Message] [varchar] (4000) NOT NULL ,
    [Message] [varchar] (4000) NOT NULL , [Exception] [varchar] (2000) NULL ,
    [Exception] [varchar] (2000) NULL , [User] [varchar] (50) NULL ,
    [User] [varchar] (50) NULL , [Category] [varchar] (50)  NULL
    [Category] [varchar] (50)  NULL  )
) 其中Date,Thread,Level,Logger,Message,Exception是log4net内置的信息。User与Category是自定义的字段。
三、     编写配置文件
 <configuration>
<configuration> <configSections>
    <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections>
    </configSections> <log4net>
    <log4net> <logger name="AA">
        <logger name="AA"> <level value="All" />
            <level value="All" /> <appender-ref ref="ADONetAppender" />
            <appender-ref ref="ADONetAppender" /> </logger>
        </logger> <!--<root>
    <!--<root> <level value="All" />
            <level value="All" /> <appender-ref ref="ADONetAppender" />
      <appender-ref ref="ADONetAppender" />  </root>-->
        </root>--> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
        <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <!--BufferSize为缓冲区大小-->
            <!--BufferSize为缓冲区大小--> <param name="BufferSize" value="1" />
            <param name="BufferSize" value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="database=aa;server=(local);User ID=sa;Password=;" />
      <connectionString value="database=aa;server=(local);User ID=sa;Password=;" /> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[User],[Category]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category)" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[User],[Category]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category)" /> <parameter>
      <parameter> <parameterName value="@log_date" />
        <parameterName value="@log_date" /> <dbType value="DateTime" />
        <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" />
        <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@thread" />
        <parameterName value="@thread" /> <dbType value="String" />
        <dbType value="String" /> <size value="255" />
        <size value="255" /> <layout type="log4net.Layout.PatternLayout">
        <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" />
          <conversionPattern value="%thread" /> </layout>
        </layout> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@log_level" />
        <parameterName value="@log_level" /> <dbType value="String" />
        <dbType value="String" /> <size value="50" />
        <size value="50" /> <layout type="log4net.Layout.PatternLayout">
        <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" />
          <conversionPattern value="%level" /> </layout>
        </layout> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@logger" />
        <parameterName value="@logger" /> <dbType value="String" />
        <dbType value="String" /> <size value="255" />
        <size value="255" /> <layout type="log4net.Layout.PatternLayout">
        <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" />
          <conversionPattern value="%logger" /> </layout>
        </layout> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@message" />
        <parameterName value="@message" /> <dbType value="String" />
        <dbType value="String" /> <size value="4000" />
        <size value="4000" /> <layout type="log4net.Layout.PatternLayout">
        <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" />
          <conversionPattern value="%message" /> </layout>
        </layout> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@exception" />
        <parameterName value="@exception" /> <dbType value="String" />
        <dbType value="String" /> <size value="2000" />
        <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" />
        <layout type="log4net.Layout.ExceptionLayout" /> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@User" />
        <parameterName value="@User" /> <dbType value="String" />
        <dbType value="String" /> <size value="50" />
        <size value="50" /> <layout type="Log4NetToDatabase.CustomLayout">
        <layout type="Log4NetToDatabase.CustomLayout"> <conversionPattern value="%UserName" />
          <conversionPattern value="%UserName" /> </layout>
        </layout> </parameter>
      </parameter> <parameter>
      <parameter> <parameterName value="@Category" />
        <parameterName value="@Category" /> <dbType value="String" />
        <dbType value="String" /> <size value="50" />
        <size value="50" /> <layout type="Log4NetToDatabase.CustomLayout">
        <layout type="Log4NetToDatabase.CustomLayout"> <conversionPattern value="%Category" />
          <conversionPattern value="%Category" /> </layout>
        </layout> </parameter>
      </parameter> </appender>
    </appender> </log4net>
  </log4net> </configuration>
</configuration>
一、 编写代码
1.     编写自定义PatternLayoutConverter类
 internal sealed class UserNamePatternConverter : PatternLayoutConverter
internal sealed class UserNamePatternConverter : PatternLayoutConverter  {
{ override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) {
    { LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
        LogMessage logMessage = loggingEvent.MessageObject as LogMessage; if (logMessage != null)
        if (logMessage != null) // 将UserName作为日志信息输出
            // 将UserName作为日志信息输出 writer.Write(logMessage.UserName);
            writer.Write(logMessage.UserName); }
   } }
} internal sealed class CategoryPatternConverter : PatternLayoutConverter
internal sealed class CategoryPatternConverter : PatternLayoutConverter {
{ override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) {
    { LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
        LogMessage logMessage = loggingEvent.MessageObject as LogMessage; if (logMessage != null)
        if (logMessage != null) writer.Write(logMessage.Category);
            writer.Write(logMessage.Category); }
    } }
}
2.     编写自定义日志输出类
 public class LogMessage
public class LogMessage {
    { private string m_UserName;
        private string m_UserName; private string m_Category;
        private string m_Category; public LogMessage()
        public LogMessage() {
        { }
        } public LogMessage(string userName, string category)
        public LogMessage(string userName, string category) {
        { m_UserName = userName;
            m_UserName = userName; m_Category = category;
            m_Category = category; }
        } public string UserName
        public string UserName {
        { get
            get {
            { return m_UserName;
                return m_UserName; }
            } set
            set {
            { m_UserName = value;
                m_UserName = value; }
            } }
        } public string Category
        public string Category {
        { get
            get {
            { return m_Category;
                return m_Category; }
            } set
            set {
            { m_Category = value;
                m_Category = value; }
            } }
        } }
    }3. 编写由log4net.Layout.LayoutSkeleton继承的类CustomLayout
由于内容过多,将在附件中给出源代码。
在此对该类做一些说明:
如果要添加自定义的字段,可以在静态构造函数static CustomLayout()中加入s_globalRulesRegistry.Add("UserName", typeof(UserNamePatternConverter));其中UserNamePatternConverter是继承于PatternLayoutConverter的类。注册完之后就可以在配置文件中使用%UserName使用了。在此只要做这些修改就能使用了,其它的代码如果有趣,可以一起交流。
4. 加载配置文件并记录日志
在AssemblyInfo.cs文件中添加[assembly: XmlConfigurator()]。它的作用同于log4net.Config.XmlConfigurator.Configure();用来读取配置文件信息。
log4net.ILog log;
在form1中添加下列代码:
 private static int count = 0;
private static int count = 0; public Form1()
        public Form1() {
        { InitializeComponent();
            InitializeComponent(); // 如果配置文件中存在名称为AA的logger,则加载
                // 如果配置文件中存在名称为AA的logger,则加载 log = LogManager.Exists("AA");
            log = LogManager.Exists("AA");         }
} private void button1_Click(object sender, EventArgs e)
        private void button1_Click(object sender, EventArgs e) {
        { ++count;
            ++count; LogMessage message = new LogMessage();
            LogMessage message = new LogMessage(); message.UserName = "xds"+count.ToString();
            message.UserName = "xds"+count.ToString(); message.Category = count.ToString();
            message.Category = count.ToString(); // 输出日志信息
                // 输出日志信息 log.Error(message);
            log.Error(message); }
        }
解决方案二:
与上面的方案只需做以下的更改:将CustomLayout类继承自log4net.Layout.PatternLayout并在构造函数中调用AddConverter()方法。该方法将占用较多的系统内存,但它代码简单易于理解。它的代码如下:
 public class CustomLayout : log4net.Layout.PatternLayout
public class CustomLayout : log4net.Layout.PatternLayout {
    { public CustomLayout2()
        public CustomLayout2() {
        { this.AddConverter("UserName", typeof(UserNamePatternConverter));
            this.AddConverter("UserName", typeof(UserNamePatternConverter)); this.AddConverter("Category", typeof(CategoryPatternConverter));
            this.AddConverter("Category", typeof(CategoryPatternConverter)); }
        } }
}参考信息:
Log4Net使用指南:http://www.tongyi.net/develop/.net/1053472.html
log4net 文章集:http://myx.cnblogs.com/archive/2005/06/28/182617.html
 
                    
                     
                    
                 
                    
                 
 
        

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号