C# 開源日志框架配置


一、NLog

注: NLog可以將日志記錄在 數據庫, 文件, 控制台, 以下只記錄文件日志配置

1. WebAPI分Controller層級打印日志配置

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Info"
    internalLogFile="./logs/nlog-internal.log">
  <!--記錄日志打印日志的路徑-->
  <targets async = "true">
    <target name = "file" xsi:type="File" encoding="GBK" fileName="${basedir}/${shortdate}/  ${aspnetmvc-controller}_${shortdate}.txt " layout="${date:format=HH\:mm\:ss}|${level}|threadid=${threadid}|${message}" />
  </targets>
  <rules>
    <logger name = "*" minlevel="Debug" writeTo="file" />
  </rules>
</nlog>
View Code

2.WebApi中創建action和controller規則

 1 using NLog;
 2 using NLog.LayoutRenderers;
 3 namespace webAPI.Areas.HelpPage
 4 {
 5   
 6   //相當於標記,配置文件內使用,即代表用了這個規則
 7     [LayoutRenderer("aspnetmvc-controller")] 
 8     public class ControllerLayoutRenderer : LayoutRenderer
 9     {
10         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
11         {
12             string controllerName = string.Empty;
13             if (HttpContext.Current != null)
14             {
15                 controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
16             }
17             builder.Append(controllerName);
18         }
19     }
20   
21   [LayoutRenderer("aspnetmvc-action")] 
22     public class ActionLayoutRenderer : LayoutRenderer
23     {
24         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
25         {
26             string controllerName = string.Empty;
27             if (HttpContext.Current != null)
28             {
29                 controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString();
30             }
31             builder.Append(controllerName);
32         }
33     }
34 }
View Code

3. 定義注冊函數

public class NLogConfig
{
    public static void Initialize()
    {
        ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("aspnetmvc-controllers", typeof(ControllerLayoutRender));
        ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("aspnetmvc-action", typeof(ActionLayoutRender));
    }
}
View Code

4. 在項目啟動的時候進行注冊 Global.asax.Application_Start()注冊

NLogConfig.Initiallize();

二、Log4Net

1.配置文件 configuration 節點中添加如下配置

<configSections>
    <!--Log4Net配置-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
<log4net>
    <!-- Define some output appenders --><!--
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="test.txt"/>
      <appendToFile value="true"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="1024KB"/>
      <rollingStyle value="Size"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
  </log4net>

或者

<log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="ERROR"/>
      <appender-ref ref="SysAppender"/>
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <logger name="WebLogger">
      <level value="ERROR"/>
    </logger>
    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="App_Data/" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
        <param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
        <param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
      </layout>
    </appender>
    <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>


</configuration>
View Code

 2. 項目啟動時注冊

log4net.Config.XmlConfigurator.Configure();//讀取了配置文件中關於Log4Net配置信息.

3.調用

ILog logger = LogManager.GetLogger("errorMsg");
logger.Error(ex.ToString());

4.使用案例

  4.1添加 log4net_config.xml

<?xml version="1.0" encoding="utf-8" ?>
<!-- 
    .NET application configuration file     
    This file must have the exact same name as your application with .config appended to it. 
    
    For example if your application is ConsoleApp.exe then the config file must be ConsoleApp.exe.config. 
    It must also be in the same directory as the application. 
  -->
  <!-- This section contains the log4net configuration settings -->
  <log4net>
    <!-- Define some output appenders -->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="rolling-log.txt" />
      <appendToFile value="true" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100" />
      <rollingStyle value="Size" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="[Header]&#13;&#10;" />
        <footer value="[Footer]&#13;&#10;" />
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <file value="log.txt" />
      <!-- Example using environment variables in params -->
      <!-- <file value="${TMP}\log-file.txt" /> -->
      <sppendToFile value="true" />
      <!-- An alternate output encoding can be specified -->
      <!-- <encoding value="unicodeFFFE" /> -->
      <layout type="log4net.Layout.PatternLayout">
        <geader value="[Header]&#13;&#10;" />
        <footer value="[Footer]&#13;&#10;" />
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
      </layout>
      <!-- Alternate layout using XML      
      <layout type="log4net.Layout.XMLLayout" /> -->
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
      </layout>
    </appender>
    <appender name="NetSendAppender" type="log4net.Appender.NetSendAppender">
      <threshold value="ERROR" />
      <server value="SQUARE" />
      <recipient value="nicko" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>
    <!-- Example of how to configure the AdoNetAppender to connect to MS Access -->
    <appender name="ADONetAppender_Access" type="log4net.Appender.AdoNetAppender">
      <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date" />
        </layout>
      </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="1024" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>
    <!-- Example of how to configure the AdoNetAppender to connect to MS SQL Server -->
    <appender name="ADONetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sa" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <!-- 
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
        </layout> 
        -->
        <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>
    </appender>
    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="ERROR" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
View Code

   4.2 添加操作類

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace Common
{
    public class LogAPI
    {
        private static readonly string LOG_DIR = "日志";
        private static readonly string LOG_FILE = LOG_DIR + "\\log" + System.DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
        private const string LOG4NET_CONFIG = "log4net_config.xml";
        private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(typeof(LogAPI));

        /// <summary>
        /// 靜態構造函數
        /// </summary>
        static LogAPI() => Configure();

        /// <summary>
        /// 輸出日志
        /// </summary>
        /// <param name="sInfo"></param>
        public static void Debug(string sInfo) => m_log.Error(sInfo);

        /// <summary>
        /// 記錄debug信息
        /// </summary>
        /// <param name="e"></param>
        public static void Debug(Exception e)
        {
            Debug("Message : " + e.Message);
            Debug("Source : " + e.Source);
            Debug("StackTrace : " + e.StackTrace);
            Debug("TargetSite : " + e.TargetSite);
            if (e.InnerException != null)
            {
                Debug(e.InnerException);
            }
        }

        /// <summary>
        /// 輸出日志
        /// </summary>
        /// <param name="sInfo"></param>
        public static void Error(string sInfo) => m_log.Error(sInfo);


        /// <summary>
        /// 記錄debug信息
        /// </summary>
        /// <param name="e"></param>
        public static void Error(Exception e)
        {
            Error("Message : " + e.Message);
            Error("Source : " + e.Source);
            Error("StackTrace : " + e.StackTrace);
            Error("TargetSite : " + e.TargetSite);
            if (e.InnerException != null)
            {
                Error(e.InnerException);
            }
        }

        /// <summary>
        /// 配置log4net環境
        /// </summary>
        private static void Configure()
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                //duhj20081013調整為使用當前dll路徑
                string sPath = GetAssemblyPath();

                if (!sPath.EndsWith("\\"))
                {
                    sPath += "\\";
                }

                //查看Log文件夾是否存在,如果不存在,則創建
                string sLogDir = sPath + LOG_DIR;
                if (!Directory.Exists(sLogDir))
                {
                    Directory.CreateDirectory(sLogDir);
                }
                string sLogFile = sPath + LOG_FILE;
                sPath += LOG4NET_CONFIG;
                doc.Load(@sPath);
                XmlElement myElement = doc.DocumentElement;

                //修改log.txt的路徑
                XmlNode pLogFileAppenderNode = myElement.SelectSingleNode("descendant::appender[@name='LogFileAppender']/file");
                // Create an attribute collection from the element.
                XmlAttributeCollection attrColl = pLogFileAppenderNode.Attributes;
                attrColl[0].Value = sLogFile;

                log4net.Config.XmlConfigurator.Configure(myElement);
            }
            catch{ }
        }

        /// <summary>
        /// 獲取Assembly的運行路徑 \\結束
        /// </summary>
        /// <returns></returns>
        public static string GetAssemblyPath()
        {
            string sCodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
            // 8是 file:// 的長度
            sCodeBase = sCodeBase.Substring(8, sCodeBase.Length - 8);

            string[] arrSection = sCodeBase.Split(new char[] { '/' });

            string sDirPath = "";
            for (int i = 0; i < arrSection.Length - 1; i++)
            {
                sDirPath += arrSection[i] + Path.DirectorySeparatorChar;
            }

            return sDirPath;
        }
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM