zoukankan      html  css  js  c++  java
  • Log4Net添加自定义日志信息 [转帖]

    一、     前言

    该文章是针对在Log4Net中添加自定义日志信息。我们在写日志的时候并不是只写消息(Message,有些情况需要记录自定义的日志信息等。下面将说明在Log4Net中增加自定义字段UserName(用户名),Category(类别)这两个字段。

    二、     建立数据库

    CREATE TABLE [dbo].[Log] (
        
    [Id] [int] IDENTITY (11NOT NULL ,
        
    [Date] [datetime] NOT NULL ,
        
    [Thread] [varchar] (255NOT NULL ,
        
    [Level] [varchar] (50NOT NULL ,
        
    [Logger] [varchar] (255NOT NULL ,
        
    [Message] [varchar] (4000NOT NULL ,
        
    [Exception] [varchar] (2000NULL ,
        
    [User] [varchar] (50NULL ,
        
    [Category] [varchar] (50)  NULL 
     

    其中Date,Thread,Level,Logger,Message,Exceptionlog4net内置的信息。UserCategory是自定义的字段。

    三、     编写配置文件

    <configuration>
        
    <configSections>
            
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        
    </configSections>
        
    <log4net>
            
    <logger name="AA">
                
    <level value="All" />
                
    <appender-ref ref="ADONetAppender" />
            
    </logger>
        
    <!--<root>
                <level value="All" />
          <appender-ref ref="ADONetAppender" /> 
            </root>
    -->
            
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
                
    <!--BufferSize为缓冲区大小-->
                
    <param name="BufferSize" value="1" />
          
    <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=;" />
          
    <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>
            
    <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>
          
    <parameter>
            
    <parameterName value="@User" />
            
    <dbType value="String" />
            
    <size value="50" />
            
    <layout type="Log4NetToDatabase.CustomLayout">
              
    <conversionPattern value="%UserName" />
            
    </layout>
          
    </parameter>
          
    <parameter>
            
    <parameterName value="@Category" />
            
    <dbType value="String" />
            
    <size value="50" />
            
    <layout type="Log4NetToDatabase.CustomLayout">
              
    <conversionPattern value="%Category" />
            
    </layout>
          
    </parameter>
        
    </appender>
      
    </log4net>
    </configuration>

    配置文件说明:该配置文件在应用程序项目中的App.config配置文件中编写。配置文件中的Log4NetToDatabase.CustomLayout为自定义类的名称,具体实现请关注编写代码。配置文件中如果将<root>节点的注释打开则会产生两条同样的信息,因为在<root>节点中有一个appender-ref子节点,它也引用了ADONetAppender附着器。由于<logger>节点已经引用了ADONetAppender附着器,并且加载它。我个人怀疑<root>节点的内容为自动加载,所以会连续产生两条同样的信息。解决该问题只要将<Root>节点注释,或将<root>节点中的<appender-ref>子节点注释就解决了。

    一、     编写代码

    1.     编写自定义PatternLayoutConverter

    internal sealed class UserNamePatternConverter : PatternLayoutConverter 
    {
        
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        
    {
            LogMessage logMessage 
    = loggingEvent.MessageObject as LogMessage;
            
    if (logMessage != null)
                
    // 将UserName作为日志信息输出
                writer.Write(logMessage.UserName);
       }

    }

    internal sealed class CategoryPatternConverter : PatternLayoutConverter
    {
        
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        
    {
            LogMessage logMessage 
    = loggingEvent.MessageObject as LogMessage;
            
    if (logMessage != null)
                writer.Write(logMessage.Category);
        }

    }

    2.     编写自定义日志输出类

    public class LogMessage
        
    {
            
    private string m_UserName;
            
    private string m_Category;
            
    public LogMessage()
            
    {
            }

            
    public LogMessage(string userName, string category)
            
    {
                m_UserName 
    = userName;
                m_Category 
    = category;
            }

            
    public string UserName
            
    {
                
    get
                
    {
                    
    return m_UserName;
                }

                
    set
                
    {
                    m_UserName 
    = value;
                }

            }

            
    public string Category
            
    {
                
    get
                
    {
                    
    return m_Category;
                }

                
    set
                
    {
                    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;
            
    public Form1()
            
    {
                InitializeComponent();
                    
    // 如果配置文件中存在名称为AA的logger,则加载
                log = LogManager.Exists("AA");        
    }

            
    private void button1_Click(object sender, EventArgs e)
            
    {
                
    ++count;
                LogMessage message 
    = new LogMessage();
                message.UserName 
    = "xds"+count.ToString();
                message.Category 
    = count.ToString();
                    
    // 输出日志信息
                log.Error(message);
            }


    解决方案二:

    与上面的方案只需做以下的更改:将CustomLayout类继承自log4net.Layout.PatternLayout并在构造函数中调用AddConverter()方法。该方法将占用较多的系统内存,但它代码简单易于理解。它的代码如下:

     

    public class CustomLayout : log4net.Layout.PatternLayout
        
    {
            
    public CustomLayout2()
            
    {
                
    this.AddConverter("UserName"typeof(UserNamePatternConverter));
                
    this.AddConverter("Category"typeof(CategoryPatternConverter));
            }

    }
    源代码下载:Log4NetToDatabase 下载
    参考信息:

    Log4Net使用指南:http://www.tongyi.net/develop/.net/1053472.html

    log4net 文章集http://myx.cnblogs.com/archive/2005/06/28/182617.html

    转自:http://www.cnblogs.com/xds/archive/2007/03/06/665124.html



    如果山不向我走来,我就向山走去!
  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/liangwei389/p/1362719.html
Copyright © 2011-2022 走看看