用log4net记录日志信息
在.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记录日志信息的更多相关文章
- [转]C#使用Log4Net记录日志
第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-n ...
- 使用Log4net记录日志
首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...
- C# 使用 log4net 记录日志
Ø 前言 在一般的开发应用中,都会涉及到日志记录,用于排查错误 或 记录程序运行时的日志信息.log4net 库是 Apache log4j 框架在 Microsoft .NET 平台的实现,是一个 ...
- ASP.NET Core使用log4net记录日志
.NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...
- 使用Log4net记录日志(非常重要)
使用Log4net记录日志 首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志 ...
- 基于Log4Net记录日志到SQLServer(自定义字段)
本文记录通过log4net将日志信息记录到SQLServer数据库中. 1.新建控制台应用程序 Log4NetDemo: 2.通过NuGet安装Log4Net (项目版本2.0.8): 3.项目根目录 ...
- 在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息
在我们常规的调试或者测试的时候,喜欢把一些测试信息打印在控制台或者记录在文件中,对于.netframework项目来说,我们输出控制台的日志信息习惯的用Console.WriteLine来输出查看,不 ...
- 将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库
最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载. 于是代码工作完成了之后,本地调试没什么问题, ...
- Windows服务使用log4net记录日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 比较流行的日志组件有以下四种,Topshelf都有相应的组件提供 log4net NL ...
随机推荐
- Codeforces 670F - Restore a Number - [字符串]
题目链接:https://codeforces.com/contest/670/problem/F 题意: 有一个非负整数 $n$,在它的右侧添上它的位数后,被发送出去:例如 $6510$,加上位数 ...
- [No0000174]Spring常用注解(收藏大全)
Spring部分 1.声明bean的注解 @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @C ...
- 如何使用IcoMoon字体图标
如何使用IcoMoon字体图标 一,字体图标工具: 1.登录字体图标网站:https://icomoon.io/app/#/select 2.Svg在线编辑工具:https://c.runoob.co ...
- 石子合并 区间dp模板
题意:中文题 Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合 ...
- zabbix设置中文并解决乱码问题
1.登录页面,设置中文 如下 2.解决乱码 进入本地PC的C:\Windows\Fonts,找到微软雅黑字体,复制粘贴,粘贴默认会生成两个文件 将msyh.ttf文件上传至zabbix服务器/usr/ ...
- data-original
<img class="lazy" style="display: inline;" alt="开光纯铜牛摆件" src=" ...
- iOS开发 - 事件传递响应链
序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...
- 浏览器数据库 IndexedDB 入门教程
一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...
- java 选择排序、冒泡排序、折半查找
public class SortAndSelectDemo{ public static void main(String[] args){ int[] arr = {3, 5, 17, 2, 11 ...
- Entity Framework中IQueryable, IEnumerable, IList的区别(转载)
原文:http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQueryable_IEnumeralb_IList_in ...