• log4net修改数据库连接字符串和写自定义信息


    最近项目需要用log4net来写日志,因为整个平台式在sharepoint上,我们需要记录具体是哪个子站点发生的日志,因此需要再原来的log表里面添加一个自定义信息列。由于平台的安全性要求,我们需要对连接字符串加密。连接字符串的信息是在AdoNetAppender读取的,所以我们要扩展该类。而自定义消息我们需要扩展PatternLayout类。其实有关log4net的介绍网上已经很多了,如log4net.dll使用

    具体的代码如下:

      #region Log helper
        public class LogMessage
        {
            public string CustomMessage { get; set; }
    
            public string Message { get; set; }
    
            public override string ToString()
            {
                return Message;
            }
        }
        internal class CustomMessageConverter : PatternLayoutConverter
        {
    
            protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
            {
                var logMessage = loggingEvent.MessageObject as LogMessage;
    
                if (logMessage != null)
                {
                    writer.Write(logMessage.CustomMessage);
    
                }
            }
        }
        internal class CustomLayout : PatternLayout
        {
    
            public CustomLayout()
            {
                this.AddConverter("CustomMessage", typeof(CustomMessageConverter));
            }
        }
    
        public class CustAdoNetAppender : AdoNetAppender
        {
            string _connectiongStr = string.Empty;
            public new string ConnectionString
            {
                set
                {
                    _connectiongStr = value;
                    base.ConnectionString = _connectiongStr;
                }
                get
                {
                    return base.ConnectionString;
                }
            }
        }
        #endregion

    配置代码

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
      </configSections>
    
      <log4net>
        <logger name="MyLogger">
          <level value="ALL"></level>
          <appender-ref ref="ADONetAppender"></appender-ref>
        </logger>
        <!--记录日志到数据库-->
        <appender name="ADONetAppender" type="ConsoleApp.CustAdoNetAppender">
          <bufferSize value="100" />
          <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <connectionString value="data source=.;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=xxx" />
            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[CustomMessage]) VALUES (@log_date, @thread, @log_level, @logger, @message,@customMessage)" />
          <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="@customMessage" />
            <dbType value="String" />
            <size value="4000" />
            <layout type="ConsoleApp.CustomLayout">
              <conversionPattern value="%CustomMessage" />
            </layout>
          </parameter>
        </appender>
      </log4net>
    </configuration>

    SQL脚本如下:

         CREATE TABLE [dbo].[Log] ( 
           [ID] [int] IDENTITY (1, 1) NOT NULL ,
           [Date] [datetime] NOT NULL ,
           [Thread] [varchar] (255) NOT NULL ,
           [Level] [varchar] (20) NOT NULL ,
           [Logger] [varchar] (255) NOT NULL ,
           [Message] [varchar] (4000) NOT NULL ,
           [CustomMessage] VARCHAR(max) NULL
         ) ON [PRIMARY]

    在AssemblyInfo.cs文件中添加一句

    [assembly: log4net.Config.DOMConfigurator(ConfigFile = "Log4Net.xml", Watch = true)]

    调用代码:

     ILog log = LogManager.GetLogger("MyLogger");
                log.Info(new LogMessage { Message = "message", CustomMessage = "cust" });

    运行结果:

  • 相关阅读:
    数据库的初始创建
    组合总和 II (Leetcode 暴力)
    Leetcode 最大正方形(两种解法)
    Python PyAPNs 实现消息推送
    Windows下nginx+web.py+fastcgi服务搭建
    Python学习预备
    《Effective C++》笔记:IV
    《Effective C++》笔记:III
    《Effective C++》笔记:II
    《Effective C++》笔记:I
  • 原文地址:https://www.cnblogs.com/majiang/p/3849838.html
Copyright © 2020-2023  润新知