c# wcf中配置log4net.config使用log4net打印日誌

1.項目中引用log4net.dll

wcf項目中首先引用log4net.dll動態庫,如下圖:
在這裏插入圖片描述

2.根目錄中配置log4net.config

在wcf項目的根目錄下放置log4net.config配置文件,我這裏並將其配置爲(按自己需求更改配置):
在這裏插入圖片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <!--Log4net Begin by Tony  2008.11.20-->
  <log4net>
    <!--數據日誌-->
    <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <param name="File" value="Log\Info\" />
      <param name="AppendToFile" value="true" />
      <param name="rollingStyle" value="Date" />
      <param name="datePattern" value="yyyy-MM-dd.'Info.log'" />
      <param name="staticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%n%n 記錄時間:%date %n日誌級別:  %-5level %n出錯類:%logger  %n錯誤描述:%message %newline%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>
    <!--錯誤日誌-->
    <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <param name="File" value="Log\Error\" />
      <param name="AppendToFile" value="true" />
      <param name="rollingStyle" value="Date" />
      <param name="datePattern" value="yyyy-MM-dd.'error.log'" />
      <param name="staticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%n%n 記錄時間:%date %n日誌級別:  %-5level %n出錯類:%logger  %n錯誤描述:%message %newline%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>
    <!--調試日誌-->
    <appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <param name="File" value="Log\Debug\" />
      <param name="AppendToFile" value="true" />
      <param name="rollingStyle" value="Date" />
      <param name="datePattern" value="yyyy-MM-dd.'debug.log'" />
      <param name="staticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%n%n 記錄時間:%date %n日誌級別:  %-5level %n出錯類:%logger  %n錯誤描述:%message %newline%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>
    <root>
      <level value="DEBUG" />
      <!--文件形式記錄日誌-->
      <appender-ref ref="ErrorRollingFileAppender" />
      <appender-ref ref="DebugRollingFileAppender" />
      <appender-ref ref="InfoRollingFileAppender" />
    </root>
  </log4net>
  <!--Log4net End-->
</configuration>

3.引用DotNet.Utilities.dll或新建錯誤日誌幫助類

注:DotNet.Utilities.dll是碼雲上一個開源.net開發工具類庫,項目地址https://gitee.com/kuiyu/dotnetcodes

using log4net;
using System;
using System.Diagnostics;

namespace DotNet.Utilities
{
    public static class Log
    {
        public static void Debug(object message)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Debug(message);
        }

        public static void Debug(object message, Exception ex)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Debug(message, ex);
        }

        public static void Error(object message)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Error(message);
        }

        public static void Error(object message, Exception exception)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Error(message, exception);
        }

      

        public static void Info(object message)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Info(message);
        }

        public static void Info(object message, Exception ex)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Info(message, ex);
        }

        public static void Warn(object message)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Warn(message);
        }

        public static void Warn(object message, Exception ex)
        {
            LogManager.GetLogger(DotNet.Utilities.Log.GetCurrentMethodFullName()).Warn(message, ex);
        }

        private static string GetCurrentMethodFullName()
        {
            StackFrame frame;
            string str;
            string str1;
            bool flag;
            try
            {
                int num = 2;
                StackTrace stackTrace = new StackTrace();
                int length = stackTrace.GetFrames().Length;
                do
                {
                    int num1 = num;
                    num = num1 + 1;
                    frame = stackTrace.GetFrame(num1);
                    str = frame.GetMethod().DeclaringType.ToString();
                    flag = (!str.EndsWith("Exception") ? false : num < length);
                }
                while (flag);
                string name = frame.GetMethod().Name;
                str1 = string.Concat(str, ".", name);
            }
            catch
            {
                str1 = null;
            }
            return str1;
        }
    }
}

4.程序中打印日誌示例

使用第3步的幫助類,向log4net.config中配置的路徑文件下打印日誌信息,如下:
在這裏插入圖片描述

5.AssemblyInfo程序集配置log4net

打開AssemblyInfo.cs程序集,增加一行代碼:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

在這裏插入圖片描述
在這裏插入圖片描述

6.重寫ServiceHostFactory與ServiceHost

在解決方案的該wcf項目中,增加一個類文件,重寫ServiceHostFactory與ServiceHost(需添加引用System.ServiceModel與System.ServiceModel.Activation引用),如下:

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;

namespace LookPictureService
{
    public class CustomServiceHostFactory : ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(
           Type serviceType, Uri[] baseAddresses)
        {
            CustomServiceHost customServiceHost =
               new CustomServiceHost(serviceType, baseAddresses);
            return customServiceHost;
        }
    }
    public class CustomServiceHost : ServiceHost
    {
        public CustomServiceHost(Type serviceType, params Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
            log4net.Config.XmlConfigurator.Configure();
        }
        protected override void ApplyConfiguration()
        {
            base.ApplyConfiguration();
        }
    }
}

7.使用代碼配置控制檯寄宿程序

新建一個控制檯項目,添加對wcf服務項目的引用,使用代碼配置控制檯以寄宿wcf服務,如下:
在這裏插入圖片描述

using LookPictureService;
using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace TestLookPictureService
{
    class Program
    {
        static void Main(string[] args)
        {
            // Step 1: Create a URI to serve as the base address.
            Uri baseAddress = new Uri("http://localhost:8734/Design_Time_Addresses/LookPictureService/CalculatorService/");
            Uri baseAddress1 = new Uri("http://localhost:8734/Design_Time_Addresses/LookPictureService/LookPictureService/");

            // Step 2: Create a ServiceHost instance.
            ServiceHost selfHost = new CustomServiceHost(typeof(CalculatorService), baseAddress);
            ServiceHost selfHost1 = new CustomServiceHost(typeof(LookPictureService.LookPictureService), baseAddress1);

            try
            {
                //修改默認Binding
                BasicHttpBinding binding = new BasicHttpBinding();
                binding.MaxBufferSize = 2147483647;
                binding.MaxReceivedMessageSize = 2147483647;

                // Step 3: Add a service endpoint.
                selfHost.AddServiceEndpoint(typeof(ICalculator), new BasicHttpBinding(), "CalculatorService");
                selfHost1.AddServiceEndpoint(typeof(ILookPictureService), binding, "LookPictureService");//使用修改的的Binding

                // Step 4: Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                ServiceMetadataBehavior smb1 = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb1.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);
                selfHost1.Description.Behaviors.Add(smb1);

                // Step 5: Start the service.
                selfHost.Open();
                selfHost1.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("The service1 is ready.");

                // Close the ServiceHost to stop the service.
                Console.WriteLine("Press <Enter> to terminate the service.");
                Console.WriteLine("Press <Enter> to terminate the service1.");
                Console.WriteLine();
                Console.ReadLine();
                selfHost.Close();
                selfHost1.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }
        }
    }
}

8.根據log4net.config的配置查看日誌

在控制檯寄宿程序的根目錄下,有配置的Log文件夾,查看日誌信息,如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章