zoukankan      html  css  js  c++  java
  • [转]log4net使用(WinForm/WebFrom)

    原来的一篇文章,今天用 WLW 转到页面上,原文章以及附件下载地址:http://zhq.ahau.edu.cn/blog/article.asp?id=366

     http://www.cnblogs.com/wenanry/archive/2008/07/04/1235198.html

     http://logging.apache.org/log4net/release/config-examples.html

    --------------------------------------------------------------------------------

    log4net为Apache 的一个子项目,其为Java版的.Net实现,具体介绍可以参看其官方网站,另外其下载地址和详细开发文档也可以找到.

    Log4net官方网站http://logging.apache.org/log4net

    WinForm和WebForm中的使用方式有点雷同,基本为(1.)配置config,(2.)初始化日志系统,(3.)类文件内记录日志.

    Config 文件内的配置方法可以为以下:

    <configuration>

    <!--日志配置部分-->

    <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>

    </configSections>

    <!--站点日志配置部分-->

    <log4net>

    <root>

    <priority value="ALL"/>

    <appender-ref ref="RollingFileAppender"/>

    </root>

    <appender name="TraceAppender" type="log4net.Appender.TraceAppender">

    <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>

    </layout>

    </appender>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">

    <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>

    </layout>

    </appender>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

    <file value="log\log.txt"/>

    <appendToFile value="true"/>

    <maxSizeRollBackups value="10"/>

    <maximumFileSize value="2000KB"/>

    <rollingStyle value="Size"/>

    <staticLogFileName value="true"/>

    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

    <layout type="log4net.Layout.PatternLayout">

    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>

    </layout>

    </appender>

    </log4net>

    </configuration>

    以上配置信息提供了RollingFile方式的日志记录方式,并保存在log.txt文件内,当日志文件超过2000k时就会自动更名,并建立新的log.txt文件,配置文件的具体使用说明可以参看log4net的开发文档.

    Log4net的基本使用方式可以参看其开发文档.这里提供一个cnblogs.com的某牛人写的一个日志操作类(AppLog.cs),这样就可以很方便使用log4net日志系统了,但缺点也就出现了(具体的缺点就是在WinForm程序内无法捕捉到追加日志的具体位置了).下面为AppLog.cs文件具体代码:

        /**//// <summary>

    /// 日志处理

    /// </summary>

    public class AppLog

    {

    /**//// <summary>

    /// 静态类

    /// </summary>

    private AppLog(){}

    private const string LOG_REPOSITORY = "Default"; // this should likely be set in the web config.

    private static ILog m_log;

    /**//// <summary>

    /// 初始化日志系统

    /// 在系统运行开始初始化

    /// Global.asax Application_Start内

    /// </summary>

    public static void Init()

    {

    log4net.Config.XmlConfigurator.Configure();

    }

    /**//// <summary>

    /// 写入日志

    /// </summary>

    /// <param name="message">日志信息</param>

    /// <param name="messageType">日志类型</param>

    public static void Write(string message, LogMessageType messageType)

    {

    DoLog(message, messageType, null, Type.GetType("System.Object"));

    }

    /**//// <summary>

    /// 写入日志

    /// </summary>

    /// <param name="message">日志信息</param>

    /// <param name="messageType">日志类型</param>

    /// <param name="type"></param>

    public static void Write(string message, LogMessageType messageType, Type type)

    {

    DoLog(message, messageType, null, type);

    }

    /**//// <summary>

    /// 写入日志

    /// </summary>

    /// <param name="message">日志信息</param>

    /// <param name="messageType">日志类型</param>

    /// <param name="ex">异常</param>

    public static void Write(string message, LogMessageType messageType, Exception ex)

    {

    DoLog(message, messageType, ex, Type.GetType("System.Object"));

    }

    /**//// <summary>

    /// 写入日志

    /// </summary>

    /// <param name="message">日志信息</param>

    /// <param name="messageType">日志类型</param>

    /// <param name="ex">异常</param>

    /// <param name="type"></param>

    public static void Write(string message, LogMessageType messageType, Exception ex,

    Type type)

    {

    DoLog(message, messageType, ex, type);

    }

    /**//// <summary>

    /// 断言

    /// </summary>

    /// <param name="condition">条件</param>

    /// <param name="message">日志信息</param>

    public static void Assert(bool condition, string message)

    {

    Assert(condition, message, Type.GetType("System.Object"));

    }

    /**//// <summary>

    /// 断言

    /// </summary>

    /// <param name="condition">条件</param>

    /// <param name="message">日志信息</param>

    /// <param name="type">日志类型</param>

    public static void Assert(bool condition, string message, Type type)

    {

    if (condition == false)

    Write(message, LogMessageType.Info);

    }

    /**//// <summary>

    /// 保存日志

    /// </summary>

    /// <param name="message">日志信息</param>

    /// <param name="messageType">日志类型</param>

    /// <param name="ex">异常</param>

    /// <param name="type">日志类型</param>

    private static void DoLog(string message, LogMessageType messageType, Exception ex,

    Type type)

    {

    m_log = LogManager.GetLogger(type);

    switch (messageType)

    {

    case LogMessageType.Debug:

    AppLog.m_log.Debug(message, ex);

    break;

    case LogMessageType.Info:

    AppLog.m_log.Info(message, ex);

    break;

    case LogMessageType.Warn:

    AppLog.m_log.Warn(message, ex);

    break;

    case LogMessageType.Error:

    AppLog.m_log.Error(message, ex);

    break;

    case LogMessageType.Fatal:

    AppLog.m_log.Fatal(message, ex);

    break;

    }

    }

    /**//// <summary>

    /// 日志类型

    /// </summary>

    public enum LogMessageType

    {

    /**//// <summary>

    /// 调试

    /// </summary>

    Debug,

    /**//// <summary>

    /// 信息

    /// </summary>

    Info,

    /**//// <summary>

    /// 警告

    /// </summary>

    Warn,

    /**//// <summary>

    /// 错误

    /// </summary>

    Error,

    /**//// <summary>

    /// 致命错误

    /// </summary>

    Fatal

    }

    }此类中提供日志的几种类型的一个枚举LogMessageType,将log4net中的几种日志记录方式进行了类型化抽象.记录日志时可以调用Write()方法写入日志. Write()有几个重载方法,可以实现不同的记录日志方式.例如:异常日志处理方式:

    Utility.AppLog.Write("Exception:", Utility.AppLog.LogMessageType.Error, ex);一般的信息类型的日志处理

    Utility.AppLog.Write("写入日志测试", Utility.AppLog.LogMessageType.Info);WinForm中使用时在Main()方法内初始化log4net日志系统.

    //初始化日志使用封装类

    Utility.AppLog.Init();

    WebForm中使用时除config文件配置log4net相关设置部分,还需要在全局文件中(Global.asax)初始化相关日志处理类:

        void Application_Start(object sender, EventArgs e)

    {

    // 在应用程序启动时运行的代码

    //初始化日志使用封装类

    TestLog4net.Utility.AppLog.Init();

    TestLog4net.Utility.AppLog.Write("Web站点运行", TestLog4net.Utility.AppLog.LogMessageType.Info);

    }

    void Application_End(object sender, EventArgs e)

    {

    //  在应用程序关闭时运行的代码

    TestLog4net.Utility.AppLog.Write("Web站点关闭", TestLog4net.Utility.AppLog.LogMessageType.Info);

    }

    为了捕捉Web站点的异常还需要在全局文件Application_Error中捕捉异常,并写入日志:

        void Application_Error(object sender, EventArgs e)

    {

    // 在出现未处理的错误时运行的代码

    Exception ex = Server.GetLastError();

    if (ex != null)

    {

    //写入错误日志

    TestLog4net.Utility.AppLog.Write("[Exception]:", TestLog4net.Utility.AppLog.LogMessageType.Error, ex);

    throw ex;

    }

    }大概就记这么多东西,详细的使用代码可以在演示代码文件(TestLog4net)内找到.

    演示代码内除了使用封装好的日志操作类记录日志外,还有使用log4net开发文档内所介绍的日志记录方式来记录日志.

    演示代码项目具体目录如下:

    TestLog4net.WebProject 为web使用测试项目,使用时可能要重新加载一下路径.

    TestLog4net.Utility 为log4net的使用封装类AppLog.cs类.

    TestLog4net.WinForm 为WinForm使用测试项目.

  • 相关阅读:
    课后作业之评价
    课堂作业之寻找水王
    构建之法阅读笔记04
    课下作业
    构建之法阅读笔记03
    学习进度条九
    学习进度条八
    冲刺第五天
    构建之法阅读笔记02
    冲刺第四天
  • 原文地址:https://www.cnblogs.com/dotnetmvc/p/3657486.html
Copyright © 2011-2022 走看看