Log4net 记录日志并写入到数据库
具体步骤如下:
1.下载log4net的Dll文件并引入到项目中,在主项目添加对log4net.dll的引用
2.在相应的Globall.cs文件中的Application_Start 事件中写入
protected void Application_Start(Object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure(
new System.IO.FileInfo( "log4net.config" ));
}
说明:其中的 log4net.config 就是日志记录专用的配置文件 ,通常情况下,对log4net 的配置在一个专用的配置文件中,这样可以方便修改与维护
3.在项目对应的 AsserblyInfro.cs文件中要添加以下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config" , Watch = true )]
说明: 表示要注册在程序集信息文件中, 受应用程序的保护, Watch=true 表示始终监视应用程序的运行情况,如果设置为false log4net 就不会监视应用程序的运行情况 ,自然也就不会记录日志了
4.在项目的主根目录下添加一个 web配置文件,与web.config同路径,之所以不写入web,config文件, 是因为这样可以单独修改调试部署,也就是非侵入式安装的思想。并将文件的名称改为 log4net.config 对应于上面前两步骤提到的 log4net.config 文件名
5 在<configuration>节点中写配置信息添加
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
6. 在 <log4net> 节点中写配置,主要的配置就是在这个节点下
<appender> 节点中定义日志的存储目标,可以是文体文档,可以是数据库,也可以是邮箱中
注意:
Logger的名称区分大小写并遵循以下规则:
1、如果A logger的名称如果是B logger名称的前缀(通过“.”连接),则说 A
logger是B logger的祖父级。
2、如果A logger的名称和B logger的名称之间不存在其他的logger名称,则
A logger是B logger的父级。
例如:A logger名称为“Foo.Bar”,B logger名称为“Foo.Bar.Baz”, A为B的父级。名称为“System”的logger是名称为“System.Text.StringBuilder”的祖父级。
3. Root logger位于logger层次级别中的顶级。
它有例外的三条规则:
1、Root logger总是存在的。
2、Root logger不能通过名称或取。
3、Root logger 有一个默认的Level 值为 Debug。
Logger 可以通过log4net.LogManager类的静态方法GetLogger获取。
Level值有: ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF
它们的优先级是: DEBUG <INFO<WARN<ERROR<FATAL
Level 继承规则:如果一个logger没有定义Level,它的Level值将从它的父级(定义了Level)继承。
日志纪录请求通过调用logger实例的输出方法实现。
这些输出方法有Debug,Info,Warn,Error和Fatal。
通过定义,输出方法决定了日志纪录请求的Level。
例如,log是一个logger实例,那么语句log.Info(“..”)的日志纪录请求Level为INFO。 如果日志纪录请求的Level比logger本身定义(或继承)的Level高,则请求是可行的,否则不可行。
总结:以下是 log4net 在log4net.config 文件中的具体配置,错误或异常日志要在catch 块中进行捕获。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<!--Log4net Begin by Tony 2008.11.20-->
<log4net>
<!-- 义日志的存储目标,可以是文体文档,可以是数据库,也可以是邮箱中, 这里存储在数据库中-->
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<!-- 存入DB 前 缓存的数量, 1代表立即存入,这样可以避免频繁的与数据库进行交互-->
<bufferSize value="10" />
<!-- 这时定义数据库连接的类型-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!--数据库连接字符串-->
<connectionString value="Data Source=.\sqlexpress;Initial Catalog=fengji;User ID=sa;Password=1;" />
<!-- 将日志写入数据库中的 sql 命令语句-->
<commandText value="INSERT INTO cms_logger ([log_date],[thread],[log_level],[logger],[lmessage],[lexception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<!-- parameter 是定义参数的节点, 就是参数化sql命令语句,和sql 参数化命令相同,注意这里参数类型要与数据库表中字段的类型,长度,个数一致否则可能写不到数据库中 -->
<parameter>
<parameterName value="@log_date" /> <!-- 定义参数的名称 -->
<dbType value="DateTime" /> <!-- 参数的类型-->
<layout type="log4net.Layout.RawTimeStampLayout" /> <!-- 控制Appender的输出格式,可以是线性的也可以是XML。-->
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="500" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!-- 设定优先级,选择 log目标 Logger 可以通过log4net.LogManager类的静态方法GetLogger获取。 Level值有:ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF
它们的级别关系是 : DEBUG <INFO<WARN<ERROR<FATAL
-->
<root>
<level value="ERROR"/>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender" />
</root>
<!-- 对特殊的目录,设置特殊的优先级 -->
<logger name="iNotes">
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender"/>
</logger>
<logger name="StellaLogger">
<level value="ALL"/>
<appender-ref ref="AdoNetAppender" />
</logger>
</log4net>
<!--Log4net End-->
</configuration>
对就的后台代码:
// 初始化 log4net 日志记录器
private static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public ActionResult Index()
{
myLogger.Info(DateTime.Now.ToString() + ": loging successs" );
// 调试消息
myLogger.Debug("这是hansong的LOG DEBUG测试!");
// 错误消息
myLogger.Error("发生错误,系统已经记录到,请联系管理员!");
return View();
}
具体的参数可以参考:
http://blog.sina.com.cn/s/blog_6d1c583c01010tf3.html