log4net--不可多得的开源日志记录组件
log4net--不可多得的开源日志记录组件
- 1 前奏
一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具。 - 2 说明
Log4net介绍就不多说,这里说下他的特点:
1.程序中如果加入了Log输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。
2.日志信息可以输出到不同的地方(文件中,控制台中,Windows事件日志,数据库等) - 3 开始
Log4net的官网:官方网站:http://logging.apache.org/log4net/ , 英文好的孩子可以多去官网上瞅瞅,我们可以去官网下载源代码或者dll文件。

下载文件后,将压缩包解压,我们可以看到解压后的文件

 
打开bin目录后,还会看到一个目录

双击“net”目录,我们可以看到各个版本号的文件夹,打开对应自己.net版本的文件,将dll文件引入到项目中去。

- 4 编码
配置config目录 
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <!--定义输出到文件中-->
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <!--定义文件存放位置-->
      <file value="D:/log4netfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd-HH:mm:ss" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
        <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
      </layout>
    </appender>
    <!--将错误信息插入SQLServer数据库数据链接   插入数据库-->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="10"/>
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <!--数据连接串-->
      <connectionString value="server=(local);database=hyoav10_pro_gdcrm;user id=sa;password=sa!@#$%^*(sa;"/>
      <!--生成表的SQL语句-->
      <!--  CREATE TABLE [dbo].[Log](
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [Date] [datetime] NOT NULL,
      [Thread] [varchar](255) COLLATE Chinese_PRC_CI_AS NOT NULL,
      [Level] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
      [Logger] [varchar](255) COLLATE Chinese_PRC_CI_AS NOT NULL,
      [Message] [varchar](4000) COLLATE Chinese_PRC_CI_AS NOT NULL,
      [Exception] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL
      ) ON [PRIMARY]-->
      <!--插入数据库的SQL语句-->
      <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>
      <!--线程ID-->
      <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>
    <!--定义输出到控制台命令行中-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <!--定义输出到windows事件中-->
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <!--启动记录日志类型-->
    <root>
      <level value="ERROR"/>
      <!--文件形式记录日志-->
      <appender-ref ref="LogFileAppender"/>
      <!--插入数据库-->
      <appender-ref ref="ADONetAppender" />
      <!--<appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="EventLogAppender"/>-->
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>
紧接着,我们把类也写出来。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace TestLog4Net
{
    public class Log
    {
        /// <summary>
        /// 自定义错误信息
        /// </summary>
        /// <param name="t">错误的类</param>
        /// <param name="ex">错误信息</param>
        public static void WriteLog(Type t, Exception ex)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Error("错误", ex);
        }
        /// <summary>
        /// 错误信息
        /// </summary>
        /// <param name="t">错误的类</param>
        /// <param name="msg">错误信息</param>
        public static void WriteLog(Type t, string msg)
        {
            log4net.ILog log = log4net.LogManager.GetLogger(t);
            log.Error(msg);
        }
    }
}
好了,我们可以开始测试我的成果了
写入测试的代码
      //第一种记录用法
      //(1)第一个参数是类名称
      //(2)第二个参数是字符串信息
      Log.WriteLog(typeof(FormMain), "测试Log4Net日志是否写入");
      //第二种记录用法
      //(1)第一个参数是类名称
      //(2)第二个参数是需要捕捉的异常块
      //try {
      //}catch(Exception ex){
      //    LogHelper.WriteLog(typeof(FormMain), ex);
      //}
好,我们可以开始测试了,执行代码,我们会在数据库和txt文档中可以看到错误日志。
数据库错误日志:

txt文档错误日志:

好了,我们的log4.net开源日志组件就好了,源代码下载:
下载地址
log4net--不可多得的开源日志记录组件的更多相关文章
- 【干货】.NET开发通用组件发布(四) 日志记录组件
		
组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...
 - 日志记录组件[Log4net]详细介绍
		
转载:http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html 因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来. 一 ...
 - C#Log4net日志记录组件的使用
		
一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...
 - 以HTML为表现的日志记录组件
		
日志搬家:http://www.loogn.net/blog/Article.aspx?id=21 关于日志记录,如果你不想随用随写,又不想用log4net的话,也许你可以了解一下这个! 我也是个很懒 ...
 - Elmah 日志记录组件
		
http://www.cnblogs.com/jys509/p/4571298.html 简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理 ...
 - log4net.NoSql +ElasticSearch 实现日志记录
		
前言: 前两天在查找如何扩展log4net的日志格式时找到一个开源项目Log4net.NoSql,它通过扩展Appender实现了把日志输出到ElasticSearch里面.顺藤摸瓜,发现涉及的项目还 ...
 - 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)
		
http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...
 - .Net Log4Net配置多文件日志记录
		
其他配置详情在网上都可以找到,但是很多看着都晕,本人就记录一下如何使用: 1.按不同级别(官方说明)可记录的日志级别有: Info.Warn.Error.Debug 2.可以按着四个配置四个输出日志路 ...
 - .Net Core(.NET6)中接入Log4net和NLog进行日志记录
		
一.接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文 ...
 
随机推荐
- shell脚本批量调用git命令
			
有时候想对本地的几个repository都进行一下pull,一个一个操作比较繁琐,所以写了个shell脚本进行简化操作. git_pull_all.sh #!/bin/sh clear functio ...
 - yield和python(如何生成斐波那契數列)
			
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...
 - phpstorm取消自动保存,修改快捷键并标识修改的文件为星星标记
			
编辑时间: 2016-8-3 15:15:37 个人通过使用,发现PhpStorm的确是 编辑PHP 的神器,提供用户效率,提供智能代码补全,快速导航以及即时错误检查. 不过,让我用起来不爽的是,它会 ...
 - 【Alpha版本】冲刺-Day3
			
队伍:606notconnected 会议时间:11月11日 会议总结 张斯巍(433) 今天安排:个人信息界面设计 完成度:100% 明天计划:个人信息界面设计 遇到的问题:ps掌握的还不够熟练,导 ...
 - 算法与设计模式系列1之Python实现常见算法
			
preface 常见的算法包括: 递归算法 二分法查找算法 冒泡算法 插入排序 快速排序 二叉树排序 下面就开始挨个挨个的说说原理,然后用Python去实现: 递归算法 一个函数(或者程序)直接或者间 ...
 - what's the CRSF ??
			
What's CSRF attack ? CSRF(" Cross-site request forgery!" 跨站请求伪造) 用实例讲原理: 我们假设一个银行网站A,一个 ...
 - vimium Keyboard Bindings
			
Modifier keys are specified as `<c-x>`, `<m-x>`, and `<a-x>` for ctrl+x, meta+x, a ...
 - JavaWeb---总结(十二)Session
			
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
 - oneM2M标准发展神速 实现万物联网的愿景
			
http://m2m.iot-online.com/news/2013102224849.html oneM2M则将负责解决独立于接取网路中通用的M2M服务层的关键需求:使其可更方便地嵌入于各种软硬体 ...
 - Objective 多态
			
多态的特点 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了. ...