• Log4net保存自定义字段到数据库(以oracle为例)


    概述

           Log4net保存自定义字段到数据库,此处以oracle数据库为例

    实现

           1、下载log4net,添加log4net引用。 

           2、创建数据库

    CREATE TABLE TASKDB.WORKFLOWLOGS
    (
      LOG_ID NUMBER NOT NULL,
      LOG_USERID VARCHAR2(100 BYTE),
      LOG_OPERATERTYPE VARCHAR2(100 BYTE),
      LOG_MESSAGE VARCHAR2(4000 BYTE),
      LOG_DATE DATE,
      LOG_LEVEL VARCHAR2(255 BYTE),
      LOG_IDENTITY VARCHAR2(255 BYTE),
      LOG_EXCEPTION VARCHAR2(4000 BYTE),
      LOG_LOGGER VARCHAR2(255 BYTE),
      LOG_SOURCE VARCHAR2(1000 BYTE)
    )

      3、添加自定义字段的实体类  

    namespace Log4NetToDatabase
    {
        /// <summary>
        /// 包含了所有的自定字段属性
        /// </summary>
        public class LogContent : IRequiresSessionState
        {
    
            public LogContent(string _UserId, string _OperaterType, string _Message)
            {
                UserId = _UserId;
                OperaterType = _OperaterType;
                Message = _Message;
            } 
    
            public string UserId { get; set; }
            public string OperaterType { get; set; }
            public string Message { get; set; }
             
    
        }
         
    
    }

      4、添加参数转换器类,每个字段一个转化类

    namespace Log4NetToDatabase
    {
        public class Log4NetConvert
        {
            internal sealed class UserIdPatternConverter : PatternLayoutConverter
            {
                override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
                {
                    LogContent content = loggingEvent.MessageObject as LogContent;
                    if (content != null)
                    {
                        writer.Write(content.UserId);
                    }
                }
            }
    
            internal sealed class OperaterTypePatternConverter : PatternLayoutConverter
            {
                override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
                {
                    LogContent content = loggingEvent.MessageObject as LogContent;
                    if (content != null)
                    {
                        writer.Write(content.OperaterType);
                    }
                }
            }
    
    
            internal sealed class MessagePatternConverter : PatternLayoutConverter
            {
                override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
                {
                    LogContent content = loggingEvent.MessageObject as LogContent;
                    if (content != null)
                    {
                        writer.Write(content.Message);
                    }
                }
            }
             
    
        } 
    }

      5、添加自定义layout类

    namespace Log4NetToDatabase
    {
        public class CustomLayout : PatternLayout
        {
            public CustomLayout()
            {
                //this.AddConverter("property", typeof(Log4NetConvert));
                this.AddConverter("UserId", typeof(Log4NetConvert.UserIdPatternConverter));
                this.AddConverter("OperaterType", typeof(Log4NetConvert.OperaterTypePatternConverter));
                this.AddConverter("Message", typeof(Log4NetConvert.MessagePatternConverter));
            }
        }
    }

      6 、添加配置信息

    <?xml version="1.0" encoding="utf-8" ?>
    
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
        </configSections>
        <log4net>
            <!--日志记录器-->
            <logger name="OperationLog" additivity="false">
                <level value="ALL"/>
                <!--设置使用的数据库记录器-->
                <appender-ref ref="AdoNetAppender_Operation"/>
            </logger>
    
            <!--数据库记录器-->
            <appender name="AdoNetAppender_Operation" type="log4net.Appender.AdoNetAppender">
                <!--sqlserver日志数据库连接串-->
                <!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
          <connectionString value="Data Source=.sqlexpress;initial catalog=kuiyu.net;User ID=sa;Password=1"  providerName="System.Data.SqlClient"/>-->
                <!--oracle日志数据库连接串-->
                <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/> 
                <connectionString value="Data Source=//localhost:1521/orcl;User ID=xxxxdb;Password=xxxxdb;"/>
    
                <!--日志数据库脚本-->
                <commandText value="INSERT INTO WORKFLOWLOGS (LOG_ID,LOG_USERID,LOG_OPERATERTYPE,  LOG_MESSAGE, LOG_DATE, LOG_LEVEL, LOG_IDENTITY, LOG_EXCEPTION, LOG_LOGGER, LOG_SOURCE) VALUES (WORKFLOWLOGS_SEQ.nextval,
                         :UserId,:OperaterType, :Message,:log_date, :log_level, :log_identity,:log_exception, :logger, :source )" />
     
                <bufferSize value="1"/>
                <!--自定义成员 -->
    
                <parameter>
                    <parameterName value=":UserId" />
                    <dbType value="String" />
                    <size value="1000" />
                    <layout type="Log4NetToDatabase.CustomLayout">
                        <conversionPattern value="%UserId" />
                    </layout> 
                </parameter>
    
                <parameter>
                    <parameterName value=":OperaterType" />
                    <dbType value="String" />
                    <size value="1000" />
                    <layout type="Log4NetToDatabase.CustomLayout">
                        <conversionPattern value="%OperaterType" />
                    </layout> 
                </parameter>
    
    
                <parameter>
                    <parameterName value=":Message" />
                    <dbType value="String" />
                    <size value="4000" />
                    <layout type="Log4NetToDatabase.CustomLayout">
                        <conversionPattern value="%Message" />
                    </layout> 
                </parameter>
    
                <parameter>
                    <parameterName value=":log_date" />
                    <dbType value="DateTime" />
                    <layout type="log4net.Layout.RawTimeStampLayout">
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value=":log_level" />
                    <dbType value="String" />
                    <size value="10" />
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%level" />
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value=":log_identity" />
                    <dbType value="String" />
                    <size value="100" />
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%identity" />
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value=":log_exception" />
                    <dbType value="String" />
                    <size value="4000" />
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%exception" />
                    </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=":source" />
                    <dbType value="String" />
                    <size value="1000" />
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%file:%line" />
                    </layout>
                </parameter>
                
            </appender>
            
            
            
        </log4net>
    </configuration>

      7、调用写入日志

    ILog log = log4net.LogManager.GetLogger("OperationLog"); 
    log.Info(new LogContent(dt_user.Rows[0]["userid"].ToString(), "登录", "登陆系统"));

    总结

           添加自定义字段的实体类

      添加参数转换器类

      添加自定义layout类

        添加配置信息

           调用写入日志

    若对您有用,请赞助个棒棒糖~

  • 相关阅读:
    kubeadm部署kubernetes
    一键部署redis-5.0.5
    二进制部署kubernetes高可用
    设计模式--行为型模式--观察者模式(Observer模式)
    设计模式--行为型模式--状态模式
    设计模式--行为型模式--责任链模式(职责链模式)
    《数学之美》在线阅读
    设计模式--行为型模式--命令模式
    设计模式--行为型模式--策略模式
    设计模式--行为型模式--模板方法模式
  • 原文地址:https://www.cnblogs.com/shurun/p/14743482.html
Copyright © 2020-2023  润新知