中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。
分类: 项目管理
2011-04-07 21:08:24
由于做Winform的习惯,现在改做WebForm,也想把Error、Warning的什么的Log文件写入当前网站的文件中。Winform可以把LOG文件写在 ..\bin\debug(或release)中,生成项目时,自适应文件。而现在的WebForm,我改把LOG文件放在哪呢?放在网站文件的某个位置,能自适应吗?我不知道,只能自己试试啦。
网络了下,找到一篇文章,使用log4net在asp.net中写日志文件,地址忘记了,还是谢谢作者。
一 Log4net简介
Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。
Log4net可以从网站下载最新版本。
二 Log4net核心组成
Log4net主要由五个部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders。
一) Logger(日志)
1. 记录日志的分类:
Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制台,文件,事件日志(可以用事件查看器查看)和邮件等多种方式。
2. 日志的级别
Log4net支持多种级别的日志。优先级从高到低依次排列如下:
FATAL > ERROR > WARN > INFO > DEBUG
此外还有ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求)这两种特殊的级别。
二) Appenders
Appenders决定日志输出的方式。
Appenders必须实现log4net.Appenders.IAppender接口。
Log4net目前支持的输出方式包括:
1 AdoNetAppender
将日志记录到数据库中。可以采用SQL和存储过程两种方式。
2 AnsiColorTerminalAppender
在ANSI 窗口终端写下高亮度的日志事件。
3 AspNetTraceAppender
能用asp.net中Trace的方式查看记录的日志。
4 BufferingForwardingAppender
在输出到子Appenders之前先缓存日志事件。
5 ConsoleAppender
将日志输出到控制台。
6 EventLogAppender
将日志写到Windows Event Log.
7 FileAppender
将日志写到文件中。
8 LocalSyslogAppender
将日志写到local syslog service (仅用于UNIX环境下).
9 MemoryAppender
将日志存到内存缓冲区。
10 NetSendAppender
将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
11 RemoteSyslogAppender
通过UDP网络协议将日志写到Remote syslog service。
12 RemotingAppender
通过.NET Remoting将日志写到远程接收端。
13 RollingFileAppender
将日志以回滚文件的形式写到文件中。
14 SmtpAppender
将日志写到邮件中。
15 TraceAppender
将日志写到.NET trace 系统。
16 UdpAppender
将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
三) Filters
Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。
Filters必须实现log4net.Filters.IFilter接口。
四) Layouts
Layouts控制日志显示的格式样式。日志的显示格式如下:
"%timestamp [%thread] %-5level %logger - %message%newline"
Timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。
Thread:执行当前代码的线程。
Level:日志的级别。
Logger:日志相关请求的名称。
Message: 日志消息。
Layouts还可以控制日志的输出样式,比如以普通形式或以xml等形式输出。
五) Object Renderers
这是很重要的一项,log4net将按照用户定义的标准输出日志消息。
Object Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。
三 如何在项目中使用log4net
下面有个基于控制台的demo,举例描述了log4net怎么用于输出日志。
本例中,日志将会记录到文件,控制台,事件日至和Access数据库中。
一)主要代码:
1. 配置文件app.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
2. LoggingExample.cs
1// Configure log4net using the .config file
2[assembly: log4net.Config.XmlConfigurator(Watch=true)]
3// This will cause log4net to look for a configuration file
4// called ConsoleApp.exe.config in the application base
5// directory (i.e. the directory containing ConsoleApp.exe)
6
7namespace ConsoleApp
8{
9 using System;
10
11 /**////
12 /// Example of how to simply configure and use log4net
13 ///
14 public class LoggingExample
15 {
16 private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
17
18 public static void Main(string[] args)
19 {
20 log.Error("Error Acc");
21 log.Fatal("Fatle Acc");
22 System.Console.ReadLine();
23
24 }
25
26 }
27}
28
运行程序,日志就会以xml中定义的四种媒介形式输出。
源代码可以从http://files.cnblogs.com/Ring1981/Log4net%20Test.rar下载。
备注:
有些作者, ,说把LOG文件放在某个固定的位置,这样合适吗?
using System;
using System.IO;
namespace WriteLog
{
///
/// WriteInLog 的摘要说明。
///
public class WriteInLog
{
private string logFileName;
private int logFileSizes;
///
/// 写入日志文件
///
public WriteInLog()
{
logFileName = @"d:\logfile.txt";
}
///
/// 自动删除日志文件大小,此方法已经重载.
///
/// 日志文件大小,单位KB
public WriteInLog(int fileSize):this()
{
if(fileSize != 0)
{
this.logFileSizes = fileSize * 1024;
}
else
{
this.logFileSizes = 1024;
}
}
///
/// 日志文件完全名,如:@"d:\logfile.txt"
///
public string LogFileName
{
set
{
this.logFileName = value;
}
}
///
/// 写入日志信息
///
/// 日志内容
/// 是否自动删除日志
public void writeInLog(string msg)
{
if(logFileSizes != 0)
{
writeInLog(msg,true);
}
else
{
writeInLog(msg,false);
}
}
///
/// 写入日志信息
///
/// 日志内容
/// 是否自动删除日志
private void writeInLog(string msg,bool IsAutoDelete)
{
try
{
FileInfo fileinfo=new FileInfo(logFileName);
if(IsAutoDelete)
{
if(fileinfo.Exists && fileinfo.Length >= logFileSizes)
{
fileinfo.Delete();
}
}
using(FileStream fs=fileinfo.OpenWrite())
{
StreamWriter sw=new StreamWriter(fs);
sw.BaseStream.Seek(0,SeekOrigin.End);
sw.WriteLine("=====================================");
sw.Write("添加日期为:" + DateTime.Now.ToString() +"\r\n");
sw.Write("日志内容为:" + msg + "\r\n");
sw.WriteLine("=====================================");
sw.Flush();
sw.Close();
}
}
catch(Exception ex)
{
ex.ToString();
}
}
}
}