Log4net is not working in .net core class library

845 Views Asked by At

I am logging with AOP. I wrote aspect for logging. When the program is running, the logging functions work, but neither the database nor a file is logged. I don't know if there is a configuration that I missed.

I also do the logging in a class library, but I don't know how and where to introduce the log4net.config there to the log4net library.

log4net.config file

    <?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>

Logged method

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

Loggers

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

LogAspect

[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)
        {
        }
    }
0

There are 0 best solutions below