• 用Log4Net记录日志


    一、概述:

          log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。

    二、一个简单的应用实例:

       下载Log4Net.dll;下载地址:http://dl.pconline.com.cn/download/401531.html

       新建项目:

    将Log4Net.dll文件复制到项目的debug文件夹下:

    将Log4Net.dll引入项目中:

    添加配置文件:

    配置文件内容如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <log4net debug="false">
            <!--按日期分割日志文件 一天一个-->
            <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender">
                <!--是否续写-->
                <param name="AppendToFile" value="true"/>
                <!--最小锁定模型以允许多个进程可以写入同一个文件-->
                <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock"/>
                <param name="StaticLogFileName" value="true"/>
                <!--保存路径-->
                <param name="File" value="Log\"/>
                <param name="DatePattern" value="yyyy-MM-dd.LOG"/>
                <param name="StaticLogFileName" value="false"/>
                <param name="RollingStyle" value="Date"/>
                <layout type="log4net.Layout.PatternLayout">
                    <param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n"/>
                </layout>
            </appender>
    
            <!--按日志容量分割日志文件 10KB一个-->
            <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender">
    
                <!--是否续写-->
                <param name="AppendToFile" value="true"/>
                <!--最小锁定模型以允许多个进程可以写入同一个文件-->
                <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock"/>
    
                <param name="StaticLogFileName" value="true"/>
    
                <!--按照文件的大小进行变换日志文件-->
                <param name="RollingStyle" value="Size"/>
                <param name="File" value="LogData\log.txt"/>
                <!--单个文件最大数量 好像只有在 按Size分割时有效-->
                <param name="MaximumFileSize" value="10KB"/>
                <!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效-->
                <param name="MaxSizeRollBackups" value="1000"/>
    
                <param name="StaticLogFileName" value="false"/>
                <layout type="log4net.Layout.PatternLayout">
                    <param name="ConversionPattern" value="发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n"/>
                </layout>
            </appender>
            <!--记录日志到数据库-->
            <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
                <bufferSize value="100"/>
                <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
                <connectionString value="data source=10.0.0.13;initial catalog=FBI-TVOEM;integrated security=false;persist security info=True;User ID=sa;Password=000000"/>
                <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 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="255"/>
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%thread"/>
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value="@log_level"/>
                    <dbType value="String"/>
                    <size value="50"/>
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%level"/>
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value="@logger"/>
                    <dbType value="String"/>
                    <size value="255"/>
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%logger"/>
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value="@message"/>
                    <dbType value="String"/>
                    <size value="4000"/>
                    <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%message"/>
                    </layout>
                </parameter>
                <parameter>
                    <parameterName value="@exception"/>
                    <dbType value="String"/>
                    <size value="2000"/>
                    <layout type="log4net.Layout.ExceptionLayout"/>
                </parameter>
            </appender>
            <root>
                <level value="INFO"/>
                <!--启用按日期分割-->
                <appender-ref ref="LogFileAppenderByDate"/>
                <!--启用按容量分割-->
                <!--<appender-ref ref="LogFileAppenderBySize" />-->
                <!--启用保存到数据库-->
                <!--<appender-ref ref="AdoNetAppender" />-->
            </root>
        </log4net>
    </configuration>

    在AssemblyInfo.cs类中添加:[assembly: log4net.Config.XmlConfigurator(Watch = true)];

    将项目属性的目标框架改为:.NET Framework 3.5或者.NET Framework 4.0;

    日志记录代码如下,需要引入命名空间:using log4net; using System.Reflection;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //需要引入的命名空间
    using log4net;  
    using System.Reflection;
    namespace LogDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            static ILog LOG =LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            private void Form1_Load(object sender, EventArgs e)
            {
                LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+":我是加载日志!!!");
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":点击了一下!!!");
            }
        }
    }

    运行程序,测试之前先看下debug下的文件:

    运行程序:

    查看目录:

     可以看到程序加载是自动创建了日志目录:Log;查看Log下目录:

     查看日志内容:

     点击下按钮,再查看日志:

    把时间修改到前一天,运行程序,并点击按钮,查看目录:

    查看日志:

    修改按钮点击事件:

      private void button1_Click(object sender, EventArgs e)
            {
    
               // LOG.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":点击了一下!!!");
                try
                {
                    int a = 1;
                    int b = 0;
                    int c = a / b;
                }
                catch (Exception ex)
                {
                    LOG.Error(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":我是异常日志,我捕获到了异常:"+ex.Message);
                }
            }

    运行程序,点击按钮,查看日志:

    聪明的你应该已经看到日志级别,之前的为INFO,捕获异常的为ERROR,

    如果想把Error和INFO存放在不同的文件中,可以参考:Log4net按照不同级别写入多个日志文件

    系统日志的重要性,可参考:http://www.cnblogs.com/PerkinsZhu/p/6440584.html

    当然,以上为C/S开发模式下的日志记录,B/S开发大同小异,可参考:http://www.cnblogs.com/zhangchenliang/p/4546352.html

    如有错误,欢迎指教,相互学习,共同进步,谢谢!!

  • 相关阅读:
    2.2.3 线程中断
    java枚举 用于声明持久化常量 和volley 请求头
    java获取昨天的日期
    使用LocalBroadcastManager
    大端模式与小端模式
    Android更新主线程UI的两种方式handler与runOnUiThread()
    android dialog圆角显示及解决出现的黑色棱角.(友情提示)
    html5中的新标签
    html中的title和alt
    Android开发之蓝牙Socket
  • 原文地址:https://www.cnblogs.com/jiangxianshen/p/7611635.html
Copyright © 2020-2023  润新知