【.NET】Log4net将操作日志写入数据库

配置文件可以参考上篇博文【.NET】log4net配置文件解析.

先在Global.aspx中添加这样一句代码,来读取配置文件,初始化log4net的环境.

public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            log4net.Config.XmlConfigurator.Configure();
        }

新建一个Log文件夹,将日志下面所需类都建在该文件夹下.养成编码好习惯.要注意这些类的命名空间一定要一致.

第一个LogMessage类.

这个类包括了自定义属性,就是所有要写入数据库的字段,对应了配置文件insert语句的内容.

using System.Web;
using System.Web.SessionState;

namespace LogDB
{
    /// <summary>
    ///LogMessage 的摘要说明
    /// </summary>
    public class LogMessage : IRequiresSessionState
    {
        public LogMessage() { }
        public LogMessage(string userID, string userName,string ip,string clazz,string method,string result)
        {
            this.userid = userID;
            this.username = userName;
            this.ip = ip;
            this.clazz = clazz;
            this.method = method;
            this.result = result;

        }
        private string userid;
        public string Userid
        {
            get { return userid; }
            set { userid = value; }
        }
        private string username;
        public string Username
        {
            get { return username; }
            set { username = value; }
        }
        private string ip;
        public string Ip
        {
            get{return ip;}
            set{ip=value;}
        }

        private string clazz;
        public string Clazz
        {
            get{return clazz;}
            set{clazz=value;}
        }

        private string method;
        public string Method
        {
            get{return method;}
            set{method=value;}
        }
        private string result;
        public string Result
        {
            get { return result; }
            set { result = value; }
        }
    }
}

第二个CustomLayout类.

这个类自定义了日志输出类型,实现思路是把自定义的字段放进Hashtable,有多少个自定义字段就写Add多少个,字段名称和配置文件保持一致,这里的命名空间和配置文件如下部分对应.

using System;
using System.Collections;
using System.IO;
using log4net.Core;
using log4net.Layout.Pattern;
using log4net.Util;
using log4net.Layout;
namespace LogDB
{
    public class CustomLayout : log4net.Layout.LayoutSkeleton
    {
        public const string DefaultConversionPattern = "%message%newline";
        public const string DetailConversionPattern = "%timestamp [%thread] %level %logger %ndc - %message%newline";
        private static Hashtable s_globalRulesRegistry;
        private string m_pattern;
        private PatternConverter m_head;
        private Hashtable m_instanceRulesRegistry = new Hashtable();
         static CustomLayout()
        {
            s_globalRulesRegistry = new Hashtable(6);
            s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
            s_globalRulesRegistry.Add("userid", typeof(UserIdPatternConverter));
            s_globalRulesRegistry.Add("ip", typeof(IpPatternConverter));
            s_globalRulesRegistry.Add("clazz", typeof(ClazzPatternConverter));
            s_globalRulesRegistry.Add("method", typeof(MethodPatternConverter));
            s_globalRulesRegistry.Add("result", typeof(ResultPatternConverter));
        }
        //--------------------------------------------------------------------
        public CustomLayout()
            : this(DefaultConversionPattern)
        { }
        public CustomLayout(string pattern)
        {
            IgnoresException = true;
            m_pattern = pattern;
            if (m_pattern == null)
            {
                m_pattern = DefaultConversionPattern;
            }
            ActivateOptions();
        }
        public string ConversionPattern
        {
            get { return m_pattern; }
            set { m_pattern = value; }
        }
        /// <summary>
        /// 对Hashtable中的值进行转换
        /// </summary>
        /// <param name="pattern"></param>
        /// <returns></returns>
        virtual protected PatternParser CreatePatternParser(string pattern)
        {
            PatternParser patternParser = new PatternParser(pattern);
            foreach (DictionaryEntry entry in s_globalRulesRegistry)
            {
                patternParser.PatternConverters[entry.Key] = entry.Value;
            }
            foreach (DictionaryEntry entry in m_instanceRulesRegistry)
            {
                patternParser.PatternConverters[entry.Key] = entry.Value;
            }
            return patternParser;
        }
        override public void ActivateOptions()
        {
            m_head = CreatePatternParser(m_pattern).Parse();

            PatternConverter curConverter = m_head;
            while (curConverter != null)
            {
                PatternLayoutConverter layoutConverter = curConverter as PatternLayoutConverter;
                if (layoutConverter != null)
                {
                    if (!layoutConverter.IgnoresException)
                    {
                        this.IgnoresException = false;

                        break;
                    }
                }
                curConverter = curConverter.Next;
            }
        }
        override public void Format(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            if (loggingEvent == null)
            {
                throw new ArgumentNullException("loggingEvent");
            }
            PatternConverter c = m_head;
            while (c != null)
            {
                c.Format(writer, loggingEvent);
                c = c.Next;
            }
        }
        public void AddConverter(ConverterInfo converterInfo)
        {
            AddConverter(converterInfo.Name, converterInfo.Type);
        }
        public void AddConverter(string name, Type type)
        {
            if (name == null) throw new ArgumentNullException("name");
            if (type == null) throw new ArgumentNullException("type");

            if (!typeof(PatternConverter).IsAssignableFrom(type))
            {
                throw new ArgumentException("The converter type specified [" + type + "] must be a subclass of log4net.Util.PatternConverter", "type");
            }
            m_instanceRulesRegistry[name] = type;
        }
        public sealed class ConverterInfo
        {
            private string m_name;
            private Type m_type;
            public ConverterInfo()
            { }
            public string Name
            {
                get { return m_name; }
                set { m_name = value; }
            }
            public Type Type
            {
                get { return m_type; }
                set { m_type = value; }
            }
        }
    }
}

然后是UserIdPatternConverter/UserNamePatternConverter/IpPatternConverter等一系列类.有多少个自定义字段就有多少个类,和customLayout下面保持一致.

LogUtil类.

logUtil类封装了记录日志的方法,共外部调用,参数为各自定义字段,方法体内调用log4net的方法.

using log4net;

/// <summary>
///LogUtil 的摘要说明
/// </summary>
public class LogUtil
{
    public LogUtil()
    {
    }
    private LogDB.LogMessage message = null;

    public void WriteLog(string strLoggerName, string userID, string userName,string ip,string clazz,string method,string result)
    {
        log4net.ILog log = log4net.LogManager.GetLogger(strLoggerName);
        message = new LogDB.LogMessage(userID, userName,ip,clazz,method,result);//用到字段辅助类
        log.Info(message);
    }

}

测试一下我们的项目.

添加default.aspx,在后台代码中编写测试:

namespace LogDB
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LogUtil logUtil = new LogUtil();
            logUtil.WriteLog("AuthoritySystem", "1", "1", "1", "1", "1", "1");
            logUtil.WriteLog("BaseSystem", "1", "1", "1", "1", "1", "1");
            logUtil.WriteLog("ExamSystem", "1", "1", "1", "1", "1", "1");
            logUtil.WriteLog("EvaluationSystem", "1", "1", "1", "1", "1", "1");
            logUtil.WriteLog("FreshSystem", "1", "1", "1", "1", "1", "1");
        }
    }
}

生成后运行,所有的操作都被记录在了数据库里,5个子系统的日志分别记录在5张表中.

时间: 2024-10-09 03:04:15

【.NET】Log4net将操作日志写入数据库的相关文章

如何借助log4j把日志写入数据库中

log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据 库,甚至能通过socket输出.本节使用MySQL数据库主要讲述如何将日志信息输入到数据库中. 用log4j将日志写入数据库主要用到是log4j包下的JDBCAppender类,它提供了将日志信息异步写入数据的功能,我们可以直接使用这个类将我 们的日志信息写入数据库:也可以扩展JDBCAppender类,就是将JDBCAppender类作为基类进行二次开发获得

使用log4j让日志写入数据库

之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记日志功能,有写文件的.打印到控制台的等等,但有时我们需要它把日志输出到后台数据库中,log4j的强大的可扩展性支持了这一点,以下就是具体的实现. 关键词:log,log4j,日志,Java,DB,数据库,slf4j 前提:已经配置好slf4j.log4j,能正常的往文件或控制台写日志. 需求:将日志

logback日志写入数据库(mysql)配置

如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender&q

将日志写入数据库

之前做的一个项目有这么个要求,在日志管理系统里,需要将某些日志信息存储到数据库里,供用户.管理员查看分析.因此我就花了点时间搞了一下这一功能,各位请看. 摘要:我们知道log4j能提供强大的可配置的记日志功能,有写文件的.打印到控制台的等等,但有时我们需要它把日志输出到后台数据库中,log4j的强大的可扩展性支持了这一点,以下就是具体的实现. 关键词:log,log4j,日志,Java,DB,数据库,slf4j 前提:已经配置好slf4j.log4j,能正常的往文件或控制台写日志. 需求:将日志

Log4NET将日志写入数据库中

Apache log4net? Config Examples Overview This document presents example configurations for the built-in appenders. These configurations are designed to work with thelog4net.Config.DOMConfigurator and the log4net.Repository.Hierarchy.Hierarchy. These

Log4net 写文件日志与数据库日志

一.数据库日志表结构 [sql] view plaincopy CREATE TABLE [dbo].[WebLog_Msg]( [LogID] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [nvarchar](255) NULL, [Level] [nvarchar](50) NULL, [Logger] [nvarchar](255) NULL, [Message] [nvarchar](2000) N

用log4j将日志写入数据库

以下为log4j中的配置参数: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %t 输出产生该日志事件的线程名: %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n" %d 输出日志时间的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2008年

log4net 添加自定义日志到数据库

添加操作日志到数据库举例: (一)建立数据库的操作日志表,如下我建立了一个简单的日志表 (二)配置文件中的配置如下 <log4net> <!--错误日志记录数据库--> <logger name="OperateDB"> <level value="INFO"/> <appender-ref ref="AdoNetAppender_OperToSql" /> </logger>

Log4j写入数据库详解

log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到数据库(可以插入任何数据库,在此主要以MSSQL为例进行详解).用log4j将日志写入数据库主要用到是log4j包下的JDBCAppender类,它提供了将日志信息异步写入数据的功能,我们可以直接使用这个类将我们的日志信息写入数据库:也可以扩展JDBCAppender类,就是将JDBCAppende