Log4net 在 .net 核心类库中不起作用

问题描述

我正在使用 AOP 进行日志记录。我写了一个方面来记录日志。当程序运行时,日志功能工作,但既不记录数据库也不记录文件。不知道有没有漏掉的配置。

我也在类库中进行日志记录,但我不知道如何以及在何处将 log4net.config 引入 log4net 库。

log4net.config 文件

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <appender name="JsonFileAppender" type="log4net.Appender.FileAppender">
      <file value="C://Log//log.json" />
      <layout type="DevFramework.Core.CrossCuttingConcerns.Logging.Log4Net.Layouts.JsonLayout" />
    </appender>
    <appender name="sqlServerAppender" 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=(localdb)\MSsqlLocalDB;Initial Catalog=northwind;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultisubnetFailover=False" />
      <commandText value="INSERT INTO Logs ([Detail],[Date],[Audit]) VALUES (@logDetail,@log_date,@audit)" />
      <parameter>
        <parameterName value="@logDetail" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="DevFramework.Core.CrossCuttingConcerns.Logging.Log4Net.Layouts.JsonLayout" />
      </parameter>
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout" value="%date{dd'-'MM'-'yyyy HH':'mm':'ss'.'fff}" />
      </parameter>
      <parameter>
        <parameterName value="@audit" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout" value="%level" />
      </parameter>
    </appender>
    <logger name="JsonFileLogger">
      <level value="ALL" />
      <appender-ref ref="JsonFileAppender" />
    </logger>
    <logger name="DatabaseLogger">
      <level value="All" />
      <appender-ref ref="sqlServerAppender" />
    </logger>

记录方法

    [LogAspect(typeof(DatabaseLogger),2)]
    [LogAspect(typeof(FileLogger),1)]
    public List<Product> GetAll()
    {
        return _productDal.GetList();
    }

记录器

    public class FileLogger : LoggerService
    {
        public FileLogger() : base(LogManager.GetLogger("JsonFileLogger")){}
    }
    public class DatabaseLogger : LoggerService
    {
        public DatabaseLogger() : base(LogManager.GetLogger("DatabaseLogger")){}
    }

日志方面

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method,TargetMemberAttributes = MulticastAttributes.Instance)]
public class LogAspect : OnMethodBoundaryAspect
{
    private Type _loggerType;
    private LoggerService _loggerService;

    public LogAspect(Type loggerType,int priority)
    {
        _loggerType = loggerType;
        AspectPriority = priority;
    }

    public override void RuntimeInitialize(MethodBase method)
    {
        if (_loggerType.BaseType != typeof(LoggerService))
        {
            throw new Exception("Wrong Logger Type");
        }

        _loggerService = (LoggerService)Activator.CreateInstance(_loggerType);
        base.RuntimeInitialize(method);
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        if (!_loggerService.IsInfoEnable)
        {
            return;
        }

        try
        {
            var logParameters = args.Method.GetParameters().Select((p,i) => new LogParameter
            {
                Name = p.Name,Type = p.ParameterType.Name,Value = args.Arguments.GetArgument(i)
            });
            var logDetail = new LogDetail
            {
                FullName = args.Method.DeclaringType == null ? null : args.Method.DeclaringType.Name,MethodName = args.Method.Name,Parameters = logParameters.ToList()
            };
            _loggerService.Info(logDetail);
        }
        catch (Exception)
        {
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)