log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文以CS应用程序为例,在VS2012中来配置并使用log4net写日志到数据库。
一、建数据库表
二、新建日志类库
1.新建Log类库,这样日志库方便移植,Log类库中包含以下文件:
/// <summary>
/// 日志实体类
/// </summary>
public class LogMessage
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
}
/// <summary>
/// 日志业务逻辑
/// </summary>
public class Log
{
private ILog logger;
public Log(Type type)
{
//加载log4net配置
log4net.Config.XmlConfigurator.Configure();
this.logger = log4net.LogManager.GetLogger(type);
}
public void Info(LogMessage message)
{
Console.WriteLine(message.Title + message.Content);
this.logger.Info(message);
}
public void Error(LogMessage message)
{
Console.WriteLine(message.Title + message.Content);
this.logger.Error(message);
}
public void Error(LogMessage message, Exception ex)
{
Console.WriteLine(message.Title + message.Content);
this.logger.Error(message, ex);
}
public void Debug(LogMessage message)
{
Console.WriteLine(message.Title + message.Content);
this.logger.Debug(message);
}
public void Warn(LogMessage message)
{
Console.WriteLine(message.Title + message.Content);
this.logger.Warn(message);
}
/// <summary>
/// 属性转换
/// </summary>
public class MyLayout : PatternLayout
{
public MyLayout()
{
this.AddConverter("property", typeof(MyMessagePatternConverter));
}
}
/// <summary>
/// 实体属性转换
/// </summary>
public class MyMessagePatternConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.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.添加引用和配置
2.1.Log类库添加对log4net的引用,我引用的版本是:log4net.2.0.3\net20-full\log4net.dll。
2.2. 应用程序配置文件中加入log4net的配置,如下:
注:<configSections>这个配置项要紧跟在<configuration>下,另外如果数据库连接配置错误,启动会报错
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\Log4NetDebug1.txt" />
</listeners>
</trace>
</system.diagnostics>
<log4net>
<root>
<!--<level value="All" />-->
<appender-ref ref="AdoNetAppender"/>
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1"/>
<connectionType value="System.Data.SqlClient.SqlConnection,System.Data, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<connectionString value=".;Database=db;User ID=sa;Password=123456;"/>
<commandText value="INSERT INTO T_log(LogLevel,Title,Content) VALUES (@LogLevel,@Title,@Content)"/>
<parameter>
<parameterName value="@LogLevel"/>
<dbType value="String"/>
<size value="20"/>
<layout type="log4net.Layout.PatternLayout" value="%level"/>
</parameter>
<!--<parameter>
<parameterName value="@LogLevel" />
<dbType value="String" />
<size value="10" />
<layout type="Log.MyLayout, Log">
<param name="ConversionPattern" value="%property{LogLevel}"></param>
</layout>
</parameter>-->
<parameter>
<parameterName value="@Title"/>
<dbType value="String"/>
<size value="200"/>
<layout type="Log.MyLayout, Log">
<param name="ConversionPattern" value="%property{Title}"></param>
</layout>
</parameter>
<parameter>
<parameterName value="@Content"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="Log.MyLayout, Log">
<param name="ConversionPattern" value="%property{Content}"></param>
</layout>
</parameter>
</appender>
</log4net>
三、使用Log日志类库
在其他项目中引用Log类库,新建日志对象,如下:
/// <summary>
/// 日志
/// </summary>
private static readonly Log log = new Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private LogMessage logmsg = new LogMessage();
//写日志
logmsg.Title = "测试";
logmsg.Content =“测试内容”;
log.Error(logmsg);
在使用的过程中,有时候日志没有写进数据库,不知道什么原因,知道的大神可以指点下,谢谢。