在.net中用log4net记录日志信息,已经是很平常的事情了。

log4net下载:http://logging.apache.org/log4net/download_log4net.cgi

百度网盘下载:http://pan.baidu.com/s/1i3GM8ML

下载后。引用log4net.dll到项目中

添加引用:

using log4net.Config;
using log4net;

生成项目后。你会发现:

这是项目框架造成的:

将目标框架默认的.NET Framework4 Client Profile修改为.NET Framework4之后再重新生成解决方案就行了。

不知道为什么。创建项目默认会是.NET Framework4 Client Profile的。其实这个框架会出现很多问题

比如:不能引用system.web程序集。遇到的就应该知道。不过知道问题的来源就好解决了。

好了。log4net准备好了。现在当然是配置文件,没有app.config的话。可以手动添加一个app.config文件

日志文件一般是写在文本文件里面。或者记录在数据库。但大家都推荐记录在文本文件中。

先看怎么把日志文件写入文本文件,来看看app.config的配置,

 <configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
定义输出到文件中
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
定义文件存放位置
<file value="log\\"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明
输出格式
样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/>
</layout>
</appender>
<root>
<level value="ERROR"/>
文件形式记录日志
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

提供一个LogHelper.cs类

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //在项目的程序集信息描述文件中,设置Log4net的可记录属性
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace ConsoleApplication1
{
class LogHelper
{
/// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t">当前消息来自成员的类</param>
/// <param name="ex">异常信息</param>
#region static void WriteLog(Type t, Exception ex) public static void WriteLog(Type t, Exception ex)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error(ex.Message, ex);
//log.Info(ex.Message, ex);
} #endregion /// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t">当前消息来自成员的类</param>
/// <param name="msg">错误消息</param>
#region static void WriteLog(Type t, string msg) public static void WriteLog(Type t, string msg)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
//log.Error(msg);
log.Info("dd");
} #endregion
}
}

配置文件有了,LogHelper帮助了也有了。现在当然是测试,模拟程序异常。写入文本文件中

 ////第一种方法。直接记录错误消息
//LogHelper.WriteLog(typeof(Program), "测试Log4Net日志是否写入"); ////第二种方法:捕获异常
try
{
//int c = 0;
// int i = 8 / c; //此处异常,将被cath捕获 Program c = null;
c.ToString();
}
catch (Exception ex)
{
//此处已经封装到LogHelper类
//log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//log.Error("Error", ex); //Program是该成员的类,可以这样获取,利用反射:MethodBase.GetCurrentMethod().DeclaringType
//LogHelper.WriteLog(typeof(Program), ex);
//所以也可以这样写
LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, ex); //一般错误
LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "一般错误");
}

因为app.config中配置的日志路径是:<file value="log\\"/>

即在Debug目录下面会有一个log文件夹,并以当前年份生成了子文件夹,最里面才是文本文件

打开看日志。如愿是生成了错误信息,没有找到对象,程序员经常遇到的错误

如果写入文本文件已经满足不了你。那你可以尝试把错误信息写入数据库

首先创建在sql server中创建保存的表

USE log4net
GO /****** Object: Table [dbo].[Log]******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO SET ANSI_PADDING ON
GO CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL, --id
[LevelName] [varchar](50) NULL, --级别名称
--[UserID] [int] NULL,
[Message] [varchar](4000) NULL, --错误描述
--[Exception] [varchar](2000) NULL,
[RecordTime] [varchar](50) NULL, --记录时间
CONSTRAINT [PK_Log_1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO

修改app.config文件:

 <configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections> <log4net>
<!--<root>
<level value="INFO"></level>
<appender-ref ref="AdoNetAppender_SQL"/>
</root>--> <logger name="WebLogger">
<level value="INFO"/>
<appender-ref ref="ADONetAppender" /> </logger> <!--SQL数据库-->
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1"/> <!-- SQL数据源 ,本地安装SQL客户端-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL连接字符串-->
<connectionString value="data source=.;initial catalog=log4net;integrated security=False;persist security info=True;User ID=sa;Password=123" /> <commandText value="INSERT INTO Log ([RecordTime],[LevelName],[Message]) VALUES (@log_date, @log_level, @message)"/> <parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</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="@exception"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>--> <parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter> <!--自定义成员 -->
<!--<parameter>
<parameterName value="@UserID" />
<dbType value="Int32" /> <layout type="JJ.Data.LogCommon.CustomLayout">
<conversionPattern value="%UserID" />
</layout> </parameter>--> </appender> <!--<root>
<level value="DEBUG" />
<appender-ref ref="ADONetAppender" /> </root>--> </log4net> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup> </configuration>

这里编写一个测试类。代码有些荣誉,暂时没考虑封装

  public class LogHelper1
{
public LogHelper1()
{ } public static string LoggerName = string.Empty; private static LogMessage message = null; private static ILog _log; public static ILog log
{
get
{
string path = @"D:\Project\ConsoleApplication1\ConsoleApplication1\App5.config";
//ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log4net.Config.XmlConfigurator.Configure(new FileInfo(path)); //根据路径直接读取app.config
//log4net.Config.XmlConfigurator.Configure(); //加载app.config,这里名字必须是app.config if (_log == null)
{
//从配置文件中读取Logger对象
//WebLogger 里面的配置信息是用来将日志录入到数据库的
//做为扩展 做判断来确定日志的记录形式,数据库也好,txt文档也好,控制台程序也好。
_log = log4net.LogManager.GetLogger(LoggerName);
}
else
{
if (_log.Logger.Name != LoggerName)
{
_log = log4net.LogManager.GetLogger(LoggerName);
}
} return _log;
}
} /// <summary>
/// 调试
/// </summary>
public static void debug()
{
if (log.IsDebugEnabled)
{
log.Debug(message);
}
} /// <summary>
/// 错误
/// </summary>
public static void error()
{
if (log.IsErrorEnabled)
{
log.Error(message);
}
} /// <summary>
/// 严重错误
/// </summary>
public static void fatal()
{
if (log.IsFatalEnabled)
{
log.Fatal(message);
}
} /// <summary>
/// 记录一般日志
/// </summary>
public static void info()
{
if (log.IsInfoEnabled)
{
log.Info(message.message);
}
} /// <summary>
/// 记录警告
/// </summary>
public static void warn()
{
if (log.IsWarnEnabled)
{
log.Warn(message);
}
} /// <summary>
/// 需要写日志的地方调用此方法
/// </summary>
/// <param name="level">自定义级别</param>
public static void SaveMessage(LogMessage logMessage, int level)
{
message = logMessage; switch (level)
{
case :
info();
break; case :
warn();
break; case :
error();
break; case :
fatal();
break; default: break;
}
} } /// <summary>
/// 错误提示类
/// </summary>
public class LogMessage
{
public object message { get; set; } }

测试代码

    try
{
int c = ;
int i = / c; }
catch (Exception ex)
{ //LogHelper1.LoggerName = "WebLogger";
LogMessage logMessage = new LogMessage();
logMessage.message = ex; //logMessage.UserID = 123456;
LogHelper1.SaveMessage(logMessage, ); }

查看数据库,也如你所愿记录了信息

看博客永远是别人的。只有在看了后自己动手操作一次,两次。。。。才是自己的。

现在怕就怕你不努力。不要怕没有东西学!!

参考资料:

http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html

http://www.cnblogs.com/Lhuatao/p/4431023.html#3164867

http://www.cnblogs.com/mbailing/archive/2012/08/28/2660002.html

用log4net记录日志信息的更多相关文章

  1. [转]C#使用Log4Net记录日志

    第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的  log4net-1.2.11-bin-n ...

  2. 使用Log4net记录日志

    首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...

  3. C# 使用 log4net 记录日志

    Ø  前言 在一般的开发应用中,都会涉及到日志记录,用于排查错误 或 记录程序运行时的日志信息.log4net 库是 Apache log4j 框架在 Microsoft .NET 平台的实现,是一个 ...

  4. ASP.NET Core使用log4net记录日志

    .NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...

  5. 使用Log4net记录日志(非常重要)

    使用Log4net记录日志   首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志 ...

  6. 基于Log4Net记录日志到SQLServer(自定义字段)

    本文记录通过log4net将日志信息记录到SQLServer数据库中. 1.新建控制台应用程序 Log4NetDemo: 2.通过NuGet安装Log4Net (项目版本2.0.8): 3.项目根目录 ...

  7. 在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息

    在我们常规的调试或者测试的时候,喜欢把一些测试信息打印在控制台或者记录在文件中,对于.netframework项目来说,我们输出控制台的日志信息习惯的用Console.WriteLine来输出查看,不 ...

  8. 将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库

    最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载. 于是代码工作完成了之后,本地调试没什么问题, ...

  9. Windows服务使用log4net记录日志

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...

随机推荐

  1. .NET Core 中依赖注入 AutoMapper 小记

    最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式 servic ...

  2. docker swarm 英文参考资料阅读列表

    将自己在使用 docker swarm 过程中阅读的英文参考资料收集在这篇博文中,便于以后查阅与温习,顺带分享. 2017年8月5日之前阅读 My experience with Docker Swa ...

  3. 泡泡一分钟:Automatic Parameter Tuning of Motion Planning Algorithms

    Automatic Parameter Tuning of Motion Planning Algorithms 运动规划算法的自动参数整定 Jos´e Cano, Yiming Yang, Brun ...

  4. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  5. CountDownLatch简单使用

    CountDownLatch介绍 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过 ...

  6. Django:视图views(一)

    1.环境搭建 在django中,视图负责与web请求进行交互 视图本质上是一个Python函数,定义在booktest/views.py.通过django1/urls.py路由到该视图中. 首先经过创 ...

  7. iOS中UITableView的一些问题思考

    UITableview的数据源为什么是代理,而不是引用? 我的理解,一般情况下控制器会引用tableView, 数据源和代理方法都是tableView的一个若引用,出了“tableView.datas ...

  8. [development][http][libhtp] suricata的http库--libhtp

    首先,从文档来看, 它支持管道化的http, 也可以说过于重量级. 其次, 还没有达到产品化的稳定性. 并不是完全对应我的需求, http模块是一个整体性能相关模块. 应该按需定制更合理. 但是,功能 ...

  9. Python开发【笔记】:aiohttp搭建简易聊天室

    简易聊天室: 1.入口main.py import logging import jinja2 import aiohttp_jinja2 from aiohttp import web from a ...

  10. 深入理解为什么应该使用transform来替代top

    话说,这个问题我们得从浏览器得渲染机制说起: 我们先来理解一下 重绘(Repainit)和 回流(Reflow): 重绘:当节点需要更改外观而不会影响布局得,比如改变 color 就称为重绘: 回流: ...