当前位置:Gxlcms > 数据库问题 > Log4Net 之将日志记录到数据库的后台实现 (二)

Log4Net 之将日志记录到数据库的后台实现 (二)

时间:2021-07-01 10:21:17 帮助过:18人阅读

技术图片
public class CustomLayout : log4net.Layout.PatternLayout
{
   public CustomLayout()
   {
        this.AddConverter("UserID", typeof(UserIDPatternConverter));
   }
}
技术图片 技术图片

  typeof(UserIDPatternConverter)语句中的UserIDPatternConverter实现了格式化的输出信息。

技术图片 技术图片
internal sealed class UserIDPatternConverter : PatternLayoutConverter 
{
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
           
        if (logMessage != null)
             writer.Write(logMessage.UserID);
    }
}
技术图片 技术图片

 

  (3)、对Log4Net的简单封装

 

技术图片 技术图片
   public class LogHelper
    {
        public LogHelper()
        {

        }

        public static string LoggerName = string.Empty;

        private static LogMessage message = null;

        private static ILog _log;

        public static ILog log
        {
            get
            {
                string path = @"C:\Log4Net.config";
                log4net.Config.XmlConfigurator.Configure(new FileInfo(path));

                if (_log == null)
                {
                    //从配置文件中读取Logger对象  
                    //WebLogger 里面的配置信息是用来将日志录入到数据库的
                    //做为扩展 做判断来确定日志的记录形式,数据库也好,txt文档也好,控制台程序也好。
                    _log = log4net.LogManager.GetLogger(LoggerName); //log4net.LogManager.GetLogger("WebLogger");
                }
                else
                {
                    if (_log.Logger.Name != LoggerName)
                    {
                        _log = log4net.LogManager.GetLogger(LoggerName);
                    }
                }

                return _log;
            }
        }


        /// <summary>
        /// 调试
        /// </summary>
        public static void debug()
        {
            if (log.IsDebugEnabled)
            {
                log.Debug(message);
            }
        }


        /// <summary>
        /// 错误
        /// </summary>
        public static void error()
        {
            if (log.IsErrorEnabled)
            {
                log.Error(message);
            }
        }

        /// <summary>
        /// 严重错误
        /// </summary>
        public static void fatal()
        {
            if (log.IsFatalEnabled)
            {
                log.Fatal(message);
            }
        }

        /// <summary>
        /// 记录一般日志
        /// </summary>
        public static void info( )
        {
            if (log.IsInfoEnabled)
            {
                //log.Info("Jerry");
                log.Info(message);
            }
        }


        /// <summary>
        /// 记录警告
        /// </summary>
        public static void warn()
        {
            if (log.IsWarnEnabled)
            {
                log.Warn(message);
            }
        }


        /// <summary>  
        /// 需要写日志的地方调用此方法  
        /// </summary>  
        /// <param name="level">自定义级别</param>  
        public static void SaveMessage(LogMessage logMessage,int level)
        {
            message = logMessage;

            switch (level)
            {
                case 1:
                    info();
                    break;
                
                case 2: 
                    warn(); 
                    break;
                
                case 3:  
                    error();
                    break;
                
                case 4: 
                    fatal();
                    break;

                default: break;
            }
        }

    }
技术图片 技术图片

 

  Log4Net根据不同的日志级别提供了不同的记录方法,对了,这里所说的日志级别就是对应的 Level 字段,我们来看一下 Log4Net的日志级别:

技术图片

  这是我从别的网站上找到的图,用来说明一下级别。好了,到此为此,我们就已经把 Log4Net 底层这好了,注意,你可以把上页的这些类都统一写到一个类库中。这样做的好处是,当其它项目要用到日志记录功能的时候,直接引用你类库的 dll 就可以了,是不是很方便。同时这样做也实现了对Log4Net的简单封装,让其它项目组的人更易使用。

 

  重点强调一下,记得在这个类库中引用Log4Net.dll。毕竟我们是要用Log4Net来实现日志记录的,别写了半天都没引用,那就要出问题了。

 

  (4)、好了,让我们在Web展示层中调用他吧! Default.aspx

技术图片 技术图片
protected void Page_Load(object sender, EventArgs e)
{
    LogHelper.LoggerName = "WebLogger";
    LogMessage logMessage = new LogMessage();

    logMessage.UserID = 123456;
    LogHelper.SaveMessage(logMessage,1);
}
技术图片 技术图片


  因为我们在配置文件中设定了缓存数,<bufferSize value="10"/> 所以你刷新十下,这时候数据就进入到数据库了。不过聪明的做法是,将bufferSize 的value值改为1

 

  (5)、数据库中的信息

技术图片

 

  (6)、对不起,刚才自己看的时候发现没有建表的Sql语句,现在补上。

技术图片 技术图片
USE [LogSys]
GO

/****** Object:  Table [dbo].[Log]    Script Date: 08/29/2012 14:56:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Log](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [LevelName] [varchar](50) NULL,
    [UserID] [int] NULL,
    [Message] [varchar](4000) NULL,
    [Exception] [varchar](2000) NULL,
    [RecordTime] [varchar](50) NULL,
 CONSTRAINT [PK_Log_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
技术图片 技术图片

 

Log4Net 之将日志记录到数据库的后台实现 (二)

标签:ati   ignore   src   后台   custom   logging   日志   isinf   red   

人气教程排行