log4net的引用和配置

由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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值