log4net保存到資料庫系列五、新增資料庫欄位

来源:http://www.cnblogs.com/jmoney/archive/2016/07/18/5682758.html
-Advertisement-
Play Games

log4net 資料庫日誌 自定義欄位 ...


園子裡面有很多關於log4net保存到資料庫的帖子,但是要動手操作還是比較不易,從頭開始學習log4net資料庫日誌一、WebConfig中配置log4net 

下麵先一點一點來學習如果進行配置

1.下載,請參考log4net保存到資料庫系列一:WebConfig中配置log4net

2.資料庫腳本

 

CREATE TABLE [dbo].[Logs] (
    [ID]         INT            IDENTITY (1, 1) NOT NULL,
    [Level]      NVARCHAR (MAX) NULL,
    [Logger]     NVARCHAR (MAX) NULL,
    [Message]    NVARCHAR (MAX) NULL,
    [Date]       DATETIME       NOT NULL,
    [Exception]  NVARCHAR (MAX) NULL,
    [ModName]    NVARCHAR (MAX) NULL,
    [UserName]   NVARCHAR (MAX) NULL,
    [Mac]        NVARCHAR (MAX) NULL,
    [IP]         NVARCHAR (MAX) NULL,
    [Url]        NVARCHAR (MAX) NULL,
    [ActionName] NVARCHAR (MAX) NULL,
    [Name]       NVARCHAR (MAX) NULL
);

 

3.消息類

 public class JimMessage : IRequiresSessionState
    {
        public JimMessage()
        {
            IP = Util.getLocalIP();
            Mac = Util.getLocalMac();
            Url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri;
        }
        public string IP { get; set; }
        public string Mac { get; set; }

        public string Url { get; set; }

        public string ModName { get; set; }    

        public string ActionName { get; set; }

        public string Message { get; set; }

        public string UserName { get; set; }

        public string Name { get; set; }
    }

 

 

 4.自定義欄位解析類

   public class MyLayout : PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("property", typeof(MyMessagePatternConverter));//指定自定義欄位的解析類
        }
    }

public class MyMessagePatternConverter : PatternLayoutConverter//解析自定義屬性,用反射獲取屬性名稱
    {
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
        }

        /// <summary>
        /// 通過反射獲取傳入的日誌對象的某個屬性的值
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
        {
            object propertyValue = string.Empty;

            PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
            if (propertyInfo != null)
                propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);

            return propertyValue;
        }
    }

 

 

5..測試代碼

ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());

AdoNetAppender adoNetAppender = new AdoNetAppender();
adoNetAppender.BufferSize = -1;
adoNetAppender.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
adoNetAppender.ConnectionString = "data source=.;initial catalog=test;persist security info=True;user id=sa;password=Jiehui@2016;MultipleActiveResultSets=True;";
adoNetAppender.CommandText = "INSERT INTO Logs ([Date],[Level],[Logger],[Message],[Exception],[UserName],[ModName],[Mac],[IP],[Url],[ActionName],[Name]) VALUES (@log_date, @log_level, @logger, @Message, @exception,@UserName,@ModName,@Mac,@IP,@Url,@ActionName,@Name)";
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@log_date", DbType = System.Data.DbType.DateTime, Layout = new log4net.Layout.RawTimeStampLayout() });
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@log_level", DbType = System.Data.DbType.String, Size = 50, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%level")) });
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@logger", DbType = System.Data.DbType.String, Size = 255, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%logger")) });      
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@exception", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(new ExceptionLayout()) });

PatternLayout layout = new MyLayout() {ConversionPattern = "%property{UserName}"};
layout.ActivateOptions();  
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@UserName", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter( layout)});

layout = new MyLayout() { ConversionPattern = "%property{ModName}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@ModName", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{Mac}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@Mac", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{IP}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@IP", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{Url}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@Url", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{ActionName}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@ActionName", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{Name}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@Name", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

layout = new MyLayout() { ConversionPattern = "%property{Message}" };
layout.ActivateOptions();
adoNetAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@Message", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(layout) });

adoNetAppender.ActivateOptions();

BasicConfigurator.Configure(rep, adoNetAppender);

ILog log = LogManager.GetLogger(rep.Name, "NoBufferingTest");
JimMessage message = new JimMessage();
message.Message = "審核成功";
message.UserName = "金朝錢";
message.Url = Request.Url.ToString();
message.ModName = "其他入庫";
message.ActionName = "審核";
message.Name = "Bill20150505";

log.Debug(message);

 

 6.測試成功

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=116213&id=3376727 最近在網路編程使用的過程中,發現errno會經常使用。因此決定在此做個留用,以備以後使用。。。 雖然errno是非線程安全的,但是可以通過幾種 ...
  • 接上篇文章,在已經部署好Kubernetes的基礎上部署kubernetes dashboard,它是官方提供的用戶管理Kubernets集群可視化工具;部署dashboard其實和在kubernets部署其他的應用一樣,創建dashboard所需的Replication Controller、Se ...
  • 一、上下文對象簡介 在MVC項目中添加一個EDMX文件的時候會添加很多文件進來,其中包括.Context.tt,和.tt這兩個T4模板,其中.Context.tt是用來生成上下文對象的T4模板,.tt生成實體類的T4模板。如圖: 實體框架 會幫我們生成XML文件和實體類,這裡它已經生成了我們要的XM ...
  • 1、Replace C#:(using System.Text.RegularExpressions;) string txt = Regex.Replace(txtLog.Text.ToString(), "/(^\\s*)|(\\s*$)/g", ""); js: var txt = docum ...
  • 在項目中經常用到DataTable,如果DataTable使用得當,不僅能使程式簡潔實用,而且能夠提高性能,達到事半功倍的效果,現對DataTable的使用技巧進行一下總結。 一、DataTable簡介 (1)構造函數 DataTable() 不帶參數初始化DataTable 類的新實例。 Data ...
  • 頁面刷新 window.location.reload(); window.location.reload(); 跳轉指定頁面 Response.Redirect(Url); 返回上一頁 window.history.back(); 返回下一頁 window.history.forward(); 返 ...
  • 一、抽象類: 抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們 ...
  • 接下來是伺服器部分,採用非同步模式,新建了一個AsynServer類,用於存放socket伺服器代碼,主要有4個方法: 有一個全局socket,下麵四個方法中都用到。 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.S ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...