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

运行结果:

posted on   dz45693  阅读(1835)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示