WebApi集成Log4net的方法及使用

首先先来尝试记录文本文件的日志

1、VS2015中,工具---->NuGet包管理器---->管理解决方案的NuGet程序包。

2、安装log4net,要注意版本和自己项目的版本相匹配。

3、安装完成后,创建log4net.config,做下图的配置:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>


    <log4net>
        <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
        <!-- Set root logger level to ERROR and its appenders -->
        <root>
          <level value="ALL" />
          <appender-ref ref="SysAppender" />
        </root>
        <!-- Print only messages of level DEBUG or above in the packages -->
        <logger name="WebLogger">
          <level value="DEBUG" />
        </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" />
          </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>

4、编写工具类,如下:

    /// <summary>
    /// 日志工具类
    /// </summary>
    public class Log4NetHelper : ILog4NetHelper
    {

        public Log4NetHelper()
        {
            log4net.Config.XmlConfigurator.Configure(new FileInfo(HttpContext.Current.Server.MapPath("~/log4net.config")));
        }

        public void Debug(object message)
        {
            LogManager.GetLogger(GetCurrentMethodFullName()).Debug(message);
        }

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

        public void Error(object message)
        {
            LogManager.GetLogger(GetCurrentMethodFullName()).Error(message);
        }

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

        private string GetCurrentMethodFullName()
        {
            try
            {
                StackFrame frame;
                string str2;
                int num = 2;
                StackTrace trace = new StackTrace();
                int length = trace.GetFrames().Length;
                do
                {
                    frame = trace.GetFrame(num++);
                    str2 = frame.GetMethod().DeclaringType.ToString();
                }
                while (str2.EndsWith("Exception") && (num < length));
                string name = frame.GetMethod().Name;
                return (str2 + "." + name);
            }
            catch
            {
                return null;
            }
        }

        public void Info(object message)
        {
            LogManager.GetLogger(GetCurrentMethodFullName()).Info(message);
        }

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

        public void Warn(object message)
        {
            LogManager.GetLogger(GetCurrentMethodFullName()).Warn(message);
        }

        public void Warn(object message, Exception ex)
        {
            LogManager.GetLogger(GetCurrentMethodFullName()).Warn(message, ex);
        }
    }
    public interface ILog4NetHelper
    {
        void Debug(object message);
        void Debug(object message, Exception ex);
        void Error(object message);
        void Error(object message, Exception exception);
        void Info(object message);
        void Info(object message, Exception ex);
        void Warn(object message);
        void Warn(object message, Exception ex);

    }

工具类需要在App_Start文件夹下的AutofacConfig文件Register方法下进行注册:

builder.RegisterType<Log4NetHelper>().As<ILog4NetHelper>();

5、调用方式:

public ILog4NetHelper _log;


_log.Info("日志已执行");

以上操作,即可实现在App_Data文件夹下形成日志文件。


接下来,再来试一下怎么把日志记录在数据库中。

没有自定义参数的话,可以输出log4net的参数,直接修改配置文件即可:

<!--记录到mysql数据库开始-->
    <appender name="SysAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1"/>
       <!--SQL数据源-->
      <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
       <!--SQL连接字符串-->
      <connectionString value="server=127.0.0.1;Database=test;Uid=root;Password=root;Port=3306" providerName="MySql.Data.MySqlClient;"/>
      <commandText value="INSERT INTO tests (id,name) VALUES (@id,@name)"/>
      <parameter>
        <parameterName value="@id" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@name" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>
<!--记录到mysql数据库结束-->

如果要自定义参数,需要如下配置(此处参考log4net:保存自定义参数到数据库 - MAQNH - 博客园):

1、新建一个类CustomerPatternConverter 

public class CustomerPatternConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                // Write the value for the specified key
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                // Write all the key value pairs
                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;
        }
    }

2、新建自定义日志的实体

public class LogEntity
{
    public string Guid { get; set; }
}

3、新建一个自定义的输出格式类:

public class CustomLayout : PatternLayout
{
    public CustomLayout()
    {
        this.AddConverter("LogEntity", typeof(CustomerPatternConverter));
    }
}

4、修改log4net.config,如下配置自定义的参数。

    <parameter>
        <parameterName value="@guid" />
        <dbType value="String" />
        <size value="100" />
        <layout type="Common.Log4Net.CustomLayout">
          <conversionPattern value="%LogEntity{Guid}" />
        </layout>
      </parameter>

5、调用方式:

public ILog4NetHelper _log;
LogEntity logEntity = new LogEntity();
logEntity.Guid = Guid.NewGuid().ToString();
_log.Info(logEntity);

这样,就完成了将日志记录到数据库了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值