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