log4net的引用和配置

来源:互联网 发布:淘宝店铺怎么过户朋友 编辑:程序博客网 时间:2024/05/31 18:39

由Apache领衔开发的跨多平台的log4工具在服务器端异常捕捉和日志管理工具,log4net。

官网下载后打开src内的项目文件,编译后取得obj内的dll文件,加载到自己的项目文件夹,引用。


在根目录,添加配置文件,命名log4net.config或者其他的,config内容如下:

<?xml version="1.0" encoding="utf-8"?><configuration>    <configSections>        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>    </configSections>    <log4net>        <logger name="loggerAX">            <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->            <!--如果没有定义LEVEL的值,则缺省为DEBUG-->            <level value="ALL" />            <appender-ref ref="SmtpAppenderAX"></appender-ref>            <appender-ref ref="FileAppenderAX"></appender-ref>        </logger>        <appender name="SmtpAppenderAX" type="log4net.Appender.SmtpAppender">            <to value="To@domain.com"></to>            <from value="From@domain.com" />            <subject value="AX'Test Log Message" />            <smtpHost value="mail.eshinfo.com" />            <username value="eshinfo" />            <password value="eshinfo" />            <bufferSize value="2048" />            <!--超长部分是否丢弃-->            <lossy value="false" />            <!--输出级别在WARN和OFF之间的日志-->            <filter type="log4net.Filter.LevelRangeFilter">                <param name="LevelMin" value="ALL" />                <param name="LevelMax" value="OFF" />            </filter>            <layout type="log4net.Layout.PatternLayout">                <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] : % newline%message%newline" />            </layout>        </appender>        <appender name="FileAppenderAX" type="log4net.Appender.RollingFileAppender">            <!--绝对路径-->            <file value="D://AX.txt"></file>            <!--相对路径,在项目的根目录下-->            <!--以最后一个路径为准,所以上面的绝对路径下不会写日志-->            <file value="./Log/AX.txt"></file>            <!--防止多线程时不能写Log,官方说线程非安全-->            <!--实际使用时,本地测试正常,部署后有不能写日志的情况-->            <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />            <appendToFile value="true" />            <!--可以为:Once|Size|Date|Composite-->            <!--Composite为Size和Date的组合-->            <rollingStyle value="composite" />            <!--日志最大个数,都是最新的-->            <!--rollingStyle节点为Date时,该节点不起作用-->            <!--rollingStyle节点为Size时,只能有value个日志-->            <!--rollingStyle节点为Composite时,每天有value个日志-->            <maxSizeRollBackups value="10" />            <!--当备份文件时,为文件名加的后缀-->            <!--后缀为*.txt时,例:AX.txt_2008-07-24.PxP 应该是程序上的一个bug-->            <!--后缀为*.TXT时,例:AX.txt_2008-07-25.TXT-->            <datePattern value="_yyyy-MM-dd.TXT" />            <!--可用的单位:KB|MB|GB-->            <!--不要使用小数,否则会一直写入当前日志-->            <maximumFileSize value="1KB" />            <!--置为true,当前最新日志文件名永远为file节中的名字-->            <staticLogFileName value="true" />            <!--输出级别在INFO和ERROR之间的日志-->            <filter type="log4net.Filter.LevelRangeFilter">                <param name="LevelMin" value="INFO" />                <param name="LevelMax" value="ERROR" />            </filter>            <!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出-->            <filter type="log4net.Filter.LevelMatchFilter">                <param name="LevelToMatch" value="WARN" />            </filter>            <filter type="log4net.Filter.DenyAllFilter" />            <layout type="log4net.Layout.PatternLayout">                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />            </layout>        </appender>    </log4net></configuration>

几乎可以直接复制使用,然后在同级目录创建Log文件夹(因为使用的相对路径),然后在aspx文件的后台代码中加上如下代码:

//下面两句应该放在网站刚刚启动时加载,并放在一个静态方法里方便调用log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath ("Log4Net.config")));ILog logAX = LogManager.GetLogger("Admin"); //写日志logAX.Error("Error AX");logAX.Info("Info AX");


通过静态调用就可以写入异常或其他日志。


基于封装的角度,我们将配置文件简化,并通过类代码操作log4net库,修改log4net.config文件如下:

<?xml version="1.0" encoding="utf-8" ?><configuration>    <!--Log设定-->    <configSections>        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0" />    </configSections>    <log4net>        <!--日志记录器logger,可以有多个-->        <logger name="fileLog">            <level value="ALL" />            <appender-ref ref="ConsoleAppender" />            <!--<appender-ref ref="LogFileAppender" />-->            <appender-ref ref="RollingLogFileAppender" />        </logger>        <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >            <layout type="log4net.Layout.PatternLayout">                <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n"/>            </layout>        </appender>        <!--<appender name="LogFileAppender"  type="log4net.Appender.FileAppender" >      <param name="File" value="logRaifuRFID.txt" />      <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="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">            <param name="File" value="./Log/"/>            <param name="AppendToFile" value="true"/>            <param name="MaxSizeRollBackups" value="10"/>            <param name="StaticLogFileName" value="false"/>            <param name="DatePattern" value="yyyyMMdd".log""/>            <param name="RollingStyle" value="Date"/>            <layout type="log4net.Layout.PatternLayout">                <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n%n"/>            </layout>        </appender>    </log4net></configuration>


通过对比差异可以发现,新的config文件可以在Log文件夹下每天以日期为名生成.log文件。


封装操作项目Common,新建Mylog类库,代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Common{    public class MyLog    {        private static log4net.ILog log = log4net.LogManager.GetLogger("fileLog");        public static void Debug(string message)        {            if (log.IsDebugEnabled)            {                log.Debug(message);            }        }        public static void Debug(System.Exception ex1)        {            if (log.IsDebugEnabled)            {                log.Debug(ex1.Message.ToString() + "/r/n" + ex1.Source.ToString() + "/r/n" +                          ex1.TargetSite.ToString() + "/r/n" + ex1.StackTrace.ToString());            }        }        public static void Error(string message)        {            if (log.IsErrorEnabled)            {                log.Error(message);            }        }        public static void Fatal(string message)        {            if (log.IsFatalEnabled)            {                log.Fatal(message);            }        }        public static void Info(string message)        {            if (log.IsInfoEnabled)            {                log.Info(message);            }        }        public static void Warn(string message)        {            if (log.IsWarnEnabled)            {                log.Warn(message);            }        }    }}



这里要注意,需要在Common的AssemblyInfo.cs文件里添加一句:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

指定程序集,并将先前的log4net.dll文件引用到Common项目,然后在web项目里引用Common,如果这样子封装,那么log4net.config文件应该放在web项目的根目录。

然后在aspx的后台代码里添加测试代码:

try            {                Convert.ToInt32("没想好");            }            catch (Exception ex1)            {                Common.MyLog.Debug(ex1);            }


在我们的Debug方法里,参数可以是Exception类型的异常,也可以是string字符串。


封装和调用方法到此结束,实际应用看自己的项目需求,附上个人一点见解。


【写日志的原则】
 
1.在catch后,把异常写入日志.
 
2.在调用第三方控件的开始和结束处.
 
3.在连接数据库的开始结束处.
 
4.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.
 
5.在自己认为很重要的逻辑处写入日志.
 


【注意】
 
发现有重要问题时最好用邮件日志,但不要指望上面的邮件配置节能发日志.
要使用能用的smtp服务器,163的只有部分用户能用.我的就不能用,很是郁闷.
 
要合理配置下列参数.
 
Ⅰ.日志文件的大小
Ⅱ.备份的日志名样式,最好时间精确到分
 

0 0
原创粉丝点击