在.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

最新文章

  1. helios架构详解(二)客户端架构和cluster
  2. iOS开发之记录用户登录状态
  3. ReactJS入门(二)—— 组件的生命周期
  4. POJ 3461 Oulipo
  5. Adapter适配器
  6. Ubuntu 14.10 下运行进程实时监控pidstat命令详解
  7. C#利用lambda在函数中创建内部函数
  8. Android adb
  9. Triangle LOVE(拓扑排序)
  10. 清空SQL Server数据库中所有表数据的方法
  11. 实例理解mapreduce任务的串行运行过程
  12. JS使用cookie实现只出现一次的广告代码效果
  13. day 7-17 多表查询
  14. 参考RPC
  15. mysql一张表多个字段关联另一张表查询
  16. 通过灰度线性映射增强图像对比度实现PS中的色阶
  17. Mysql系列八:Mycat和Sharding-jdbc的区别、Mycat分片join、Mycat分页中的坑、Mycat注解、Catlet使用
  18. 20155320《网络对抗》Exp4 恶意代码分析
  19. UVa 1601 万圣节后的早晨
  20. Scala中“=&gt;”用法及含义

热门文章

  1. minikube k8 ingress--https://kubernetes.io/docs
  2. post/get in console of JSarray/js 数组详细操作方法及解析合集
  3. javascript中的值如何传递到django下的views.py中或者数据库中?
  4. jquery.axios无刷新机制删除
  5. Nand Flash 驱动框架
  6. svn介绍
  7. Python递归优化方法
  8. 循环打印视图(学习WHILE循环)
  9. HTML中--定义header和footer高度中间自适应
  10. wechat-注意事项