用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

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

 

posted @ 2017-09-30 12:24  #疆先绅#  阅读(421)  评论(0编辑  收藏  举报