您的位置:首页 > 博客中心 > 数据库 >

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

时间:2022-03-14 04:32

配置文件可以参考上篇博文.

 

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


public class Global : System.Web.HttpApplication
    {

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

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


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; } } } }




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; }
            }
        }
    }
}






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); } }

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张表中.



热门排行

今日推荐

热门手游