首先先来尝试记录文本文件的日志
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=""Logs_"yyyyMMdd".txt"" />
<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);
这样,就完成了将日志记录到数据库了。