asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能。应用log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
那么我们如何在web项目中使用log4net呢?
一、基本配置
1、下载log4net,地址如下:,如下图所示:
2、下载到本地后,进行解压,,并找到对应版本的.net framework版本,如下图所示:
3、在项目中添加log4net.dll的引用,如下图所示:
4、在web项目根目录下创建log4net.config配置文件,如下图所示:
配置文件log4new.config xml代码如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <log4net debug="false">
- <appender name="logfileappender" type="log4net.appender.fileappender">
- <param name="file" value="log/at.log"/>
- <param name="datepattern" value="yy-mm-dd hh:mm"/>
- <param name="appendtofile" value="true"/>
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="httptraceappender" type="log4net.appender.aspnettraceappender">
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="eventlogappender" type="log4net.appender.eventlogappender">
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="rollinglogfileappender" type="log4net.appender.rollingfileappender">
- <file value="log\at"/>
- <appendtofile value="true"/>
- <rollingstyle value="date"/>
- <datepattern value="_yyyymmdd'.log'"/>
- <staticlogfilename value="false"/>
- <layout type="log4net.layout.patternlayout">
- <conversionpattern value="%d [%t] %-5p %c - %m%n"/>
- </layout>
- </appender>
- <root>
- <level value="info"/>
- <!--<level value="error" />-->
- <appender-ref ref="rollinglogfileappender"/>
- </root>
- </log4net>
5、项目中添加一个loghelper.cs操作类,这样可以之后的其他页面进行调用,如下图所示:
loghelper.cs类代码如下:
- using system;
- using system.collections.generic;
- using system.linq;
- using system.web;
- [assembly: log4net.config.xmlconfigurator(watch = true)]
- namespace apesm_ggj.commonclass
- {
- public class loghelper
- {
- /// <summary>
- /// 输出日志到log4net
- /// </summary>
- /// <param name="t"></param>
- /// <param name="ex"></param>
- #region static void writelog(type t, exception ex)
- public static void writelog(type t, exception ex)
- {
- log4net.ilog log = log4net.logmanager.getlogger(t);
- log.error("error", ex);
- }
- #endregion
- /// <summary>
- /// 输出日志到log4net
- /// </summary>
- /// <param name="t"></param>
- /// <param name="msg"></param>
- #region static void writelog(type t, string msg)
- public static void writelog(type t, string msg)
- {
- log4net.ilog log = log4net.logmanager.getlogger(t);
- log.error(msg);
- }
- #endregion
- }
- }
6、在项目中添加一个全局应用程序类global.asax,如下图所示:
方法中添加如下代码:
- protected void application_start(object sender, eventargs e)
- {
- //应用程序启动时,自动加载配置log4net
- xmlconfigurator.configure();
- }
7、打开web.config文件,添加如下配置信息,如下图所示:
配置文件代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <!--
- 有关如何配置 asp.net 应用程序的详细信息,请访问
- http://go.microsoft.com/fwlink/?linkid=169433
- -->
- <configuration>
- <configsections>
- <section name="log4net" type="log4net.config.log4netconfigurationsectionhandler, log4net"/>
- </configsections>
- <log4net configsource="log4net.config"/>
- <system.web>
- <httpmodules>
- <!--重写ihttpmodule类,需要配置的信息-->
- <!--<add name="filtermodule" type="apesm_ggj.filtermodule,apesm_ggj" />-->
- </httpmodules>
- <compilation debug="true" targetframework="4.0" />
- </system.web>
- </configuration>
8、在页面中调用,进行日志写入,如下图所示:
页面调用代码:
- protected void page_load(object sender, eventargs e)
- {
- if (!ispostback)
- {
- loghelper.writelog(typeof(login), "测试在web项目中使用log4net日志!");
- }
- }
9、查看项目根目录下的log文件夹,可以看见我们写入的日志log文件,如下图所示:
至此在web项目中使用log4net进行日志记录的功能就已经实现了。
---------------------------------------------------------------------------------------------------------------------
二、扩展
上面实现的是将日志写入到文件中,那么如果想写入到数据库中,该如何操作,这里以sql server为例,创建一个日志表,然后修改log4net.config文件,如下代码:
- <?xml version="1.0" encoding="utf-8" ?>
- <log4net debug="false">
- <appender name="adonetappender" type="log4net.appender.adonetappender">
- <buffersize value="10" />
- <connectiontype value="system.data.sqlclient.sqlconnection, system.data, version=1.0.5000.0, culture=neutral, publickeytoken=b77a5c561934e089" />
- <connectionstring value="database=csdn;server=.;uid=sa;pwd=111111;connect timeout=15;" />
- <commandtext value="insert into errorlog ([dtdate],[sthread],[slevel],[slogger],[smessage],[sexception]) values (@log_date, @thread, @log_level, @logger, @message, @exception)" />
- <parameter>
- <parametername value="@log_date" />
- <dbtype value="datetime" />
- <layout type="log4net.layout.rawtimestamplayout" />
- </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="3000" />
- <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>
- <!-- setup the root category, add the appenders and set the default level -->
- <root>
- <level value="warn"/>
- <level value="info"/>
- <level value="debug"/>
- <level value="fine"/>
- <appender-ref ref="adonetappender" />
- </root>
- <!-- specify the level for some specific categories -->
- <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>
注意<buffersize value="10" /> ,需要注意的一个参数 buffersize=10 表示是记录10 条到缓冲区,满10条后再写入sql server;
时将其修改为1
生产环境建议100
上面配置节中数据库名,用户名和密码,根据实际情况进行修改。
数据库表errorlog创建语句为:
- create table errorlog(
- nid bigint identity(1,1) not null,
- dtdate datetime not null,
- sthread nvarchar(100) not null,
- slevel nvarchar(200) not null,
- slogger nvarchar(500) not null,
- smessage nvarchar(3000) not null,
- sexception nvarchar(4000) null
- );
如下图所示:
三、整合
想同时保存到日志文件和数据库,log4net.config的文件配置如下xml代码所示:
- <?xml version="1.0" encoding="utf-8" ?>
- <log4net debug="false">
- <!-- 将日志信息写入sql server数据库 2015-09-29-->
- <appender name="adonetappender" type="log4net.appender.adonetappender">
- <buffersize value="1" />
- <connectiontype value="system.data.sqlclient.sqlconnection, system.data, version=1.0.5000.0, culture=neutral, publickeytoken=b77a5c561934e089" />
- <connectionstring value="database=csdn;server=.;uid=sa;pwd=111111;connect timeout=15;" />
- <commandtext value="insert into errorlog ([dtdate],[sthread],[slevel],[slogger],[smessage],[sexception]) values (@log_date, @thread, @log_level, @logger, @message, @exception)" />
- <parameter>
- <parametername value="@log_date" />
- <dbtype value="datetime" />
- <layout type="log4net.layout.rawtimestamplayout" />
- </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="3000" />
- <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>
- <!-- 将日志信息写入到项目日志文件 2015-09-29 -->
- <appender name="logfileappender" type="log4net.appender.fileappender">
- <param name="file" value="log/at.log"/>
- <param name="datepattern" value="yy-mm-dd hh:mm"/>
- <param name="appendtofile" value="true"/>
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="httptraceappender" type="log4net.appender.aspnettraceappender">
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="eventlogappender" type="log4net.appender.eventlogappender">
- <layout type="log4net.layout.patternlayout">
- <param name="conversionpattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
- </layout>
- </appender>
- <appender name="rollinglogfileappender" type="log4net.appender.rollingfileappender">
- <file value="log\at"/>
- <appendtofile value="true"/>
- <rollingstyle value="date"/>
- <datepattern value="_yyyymmdd'.log'"/>
- <staticlogfilename value="false"/>
- <layout type="log4net.layout.patternlayout">
- <conversionpattern value="%d [%t] %-5p %c - %m%n"/>
- </layout>
- </appender>
- <!--设置根目录,添加appenders并设置默认日志等级 -->
- <root>
- <level value="warn"/>
- <level value="info"/>
- <level value="debug"/>
- <level value="fine"/>
- <appender-ref ref="adonetappender" />
- <appender-ref ref="rollinglogfileappender"/>
- </root>
- <!-- 为特定的目录指定等级 -->
- <logger name="inotes">
- <level value="warn"/>
- <level value="info"/>
- <
相关文章:
-
-
break,return和continue三者区别(Java)
一、break用于完全结束一个循环,跳出循环体。 不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。 bre... [阅读全文] -
GF(p)上的ELGamal型椭圆曲线密码详解(Java实现)
GitHub 椭圆曲线密码 椭圆曲线密码(Elliptic Curve Cryptosystem),简称ECC,是Neal Koblitz和Vict... [阅读全文] -
前面介绍了多态的相关用法,可以看到一个子类从父类继承之后,便能假借父类的名义到处晃悠。这种机制在正常情况之下没啥问题,但有时为了预防意外发生,往往只... [阅读全文]
-
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
上一篇: 首先说明
下一篇: 能和我一起游泳的我就嫁给他
发表评论