软件开发中的日志log问题
一、C#使用EventLog类操作系统日志
微软URL ,VS.90).aspx
1。直接使用EventLog类写入系统日志中
我们先了解下系统日志的一些概念,如下图示:
写入系统日志时必需指定事件源,再由系统判断该事件源注册在哪个日志下,{zh1}在该日志下增加一条事件。使用EventLog类很容易就能新增一条事件:
下边创建一个日志"自定义事件",并将abc事件源注册到"自定义事件",{zh1}新增一条事件:
DEMO(在系统中写日志会涉及ASP.NET安全操作权限问题,请参考)
public void log()
{
//创建日志源,判断是否已经存在
if (!System.Diagnostics.EventLog.SourceExists("我的日志源"))
{
//一个时间日志源不应该创建后立即被使用。
//这里需要一定的恢复时间来确保执行程序使用创建的日志源时,日志源已经被创建。
//再次运行也这个例子来使用新的日志源。
System.Diagnostics.EventLog.CreateEventSource("我的日志源", "我的日志");
Console.WriteLine("创建事件源");
Console.WriteLine("正在退出,请再次运行程序来使用日志源");
// 日志源已经被创建。退出程序来允许它被注册。
return;
}
//创建一个EventLog类实例并分配日志源.
System.Diagnostics.EventLog myLog = new System.Diagnostics.EventLog();
myLog.Source = "我的日志源";
//写入一个报告性信息到事件日志.
myLog.WriteEntry("写入事件日志");
}
二、文本文件记录日志的简单实用的日志类,
它有如下几个特点:
1)按日期每天生产不同日志文件,方便按照日期来查找日志。
2)按日志类型生产不同的文件,比如 跟踪信息、警告信息、错误信息用不同的日志文件来记录;方便我们查找指定类型的日志。
3)可以指定保持日志文件文件夹,如果不指定日志文件夹,Web应用保持到Bin文件夹,Windows Forms应用保持到.EXE文件所在的文件夹。
4)可以指定日志文件的前缀。
public class LogManager
{
private static string logPath = string.Empty;
/// <summary>
/// 保存日志的文件夹
/// </summary>
public static string LogPath
{
get
{
if (logPath == string.Empty)
{
if (System.Web.HttpContext.Current == null)
// Windows Forms 应用
logPath = AppDomain.CurrentDomain.BaseDirectory;
else
// Web 应用
logPath = AppDomain.CurrentDomain.BaseDirectory + @"bin\";
}
return logPath;
}
set{ logPath = value;}
}
private static string logFielPrefix = string.Empty;
/// <summary>
/// 日志文件前缀
/// </summary>
public static string LogFielPrefix
{
get { return logFielPrefix; }
set { logFielPrefix = value; }
}
/// <summary>
/// 写日志
/// </summary>
public static void WriteLog(string logFile, string msg)
{
try
{
System.IO.StreamWriter sw = System.IO.File.AppendText(
LogPath + LogFielPrefix + logFile + " " +
DateTime.Now.ToString("yyyyMMdd") + ".Log"
);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
sw.Close();
}
catch
{ }
}
/// <summary>
/// 写日志
/// </summary>
public static void WriteLog(LogFile logFile, string msg)
{
WriteLog(logFile.ToString(), msg);
}
}
/// <summary>
/// 日志类型
/// </summary>
public enum LogFile
{
Trace,
Warning,
Error,
SQL
}
三、数据库日志系统设计及一点思路
我们在做企业管理系统时,有多多少少都有对数据的完整性有所要求,比如要求系统不能物理删除记录,要求添加每一条数据时都要有系统记录、或者更新某条数据都需要跟踪到变化的内容、或者删除数据时需要记录谁删除了,何时删除了,以便误删后可以通过系统的XXX功能来恢复误删的数据。
我将这种功能称为操作日志
为什么要做操作日志?
其实上文也描述了一些,其主要目的就是跟踪到每一个用户在系统的操作行为,如对数据进行查询、新增、编辑或删除甚至是登录等行为。更进一步的理解可以说是对用户使用系统情况的跟踪,对数据的跟踪防止数据意外删除、更改时有所记录,有所依据,以便对数据的还原,从某种程序上可以保护数据的完整性。
系统设计
场景
我们现在有一张表叫Employee:
ID int
Name nvarchar(50)
Gender nvarchar(2)
DateCreated datetime
CreateUser nvarchar(50)
在aspx页面中可能会有EmployeeEdit.aspx(用来添加或更新Employee信息等操作),EmployeeList.aspx(用来查询或进行删除Employee信息等操作)
好了,现在我们要对Empoyee表操作的信息做一个系统日志,那怎么办?
也许你可以建立多一个表跟Employee表一模一样的,叫做EmployeeLog:
ID int
Name nvarchar(50)
Gender nvarchar(2)
DateCreated datetime
CreateUser nvarchar(50)
LogCreated datetime
OperationType int
其中加多了一些附属的信息如LogCreated(日志添加日期)和OperationType(查询、新增、删除、更新)
此时这种情况可能大家在做用户登录日志的时候是一件很常见的事件。
但……问题来了,假如我需要对表EmployeeIncome(员工的收入情况)做日志那怎么办?
好建立多一张表叫EmployeeIncomeLog来记录员工收入情况的操作日志。
假如又需要对表FixedAsset(固定资产)进行日志记录那又怎么办?
好了,大家可能意识到我们这样做不但会造成表数量的增倍,而且大大的增加了工作量和开发时间,对数据库表不易管理等情况。
因此我们需要一个能够通过简单的配置和编写就可以完成以上功能的日志管理
数据库设计
包括三个表,
LogSetting(日志设置)——用来存储配置业务表名、业务名称、主键等
LogSettingDetail(日志设置明细)——用来存储配置业务表需要记录的详细内容,如Employee表中,我们可能需要记录字段Name、Gender等信息。
LogOperation(操作日志)——用来记录用户对各种业务操作的内容情况。
下篇将讨论用代码如何实现日志管理的功能,下面先来几张图:
日志列表:
{zh1}编辑: tommyhu 编辑于2010/06/11 10:05
一、C#使用EventLog类操作系统日志
微软URL ,VS.90).aspx
1。直接使用EventLog类写入系统日志中
我们先了解下系统日志的一些概念,如下图示:
写入系统日志时必需指定事件源,再由系统判断该事件源注册在哪个日志下,{zh1}在该日志下增加一条事件。使用EventLog类很容易就能新增一条事件:
下边创建一个日志"自定义事件",并将abc事件源注册到"自定义事件",{zh1}新增一条事件:
DEMO(在系统中写日志会涉及ASP.NET安全操作权限问题,请参考)
public void log()
{
//创建日志源,判断是否已经存在
if (!System.Diagnostics.EventLog.SourceExists("我的日志源"))
{
//一个时间日志源不应该创建后立即被使用。
//这里需要一定的恢复时间来确保执行程序使用创建的日志源时,日志源已经被创建。
//再次运行也这个例子来使用新的日志源。
System.Diagnostics.EventLog.CreateEventSource("我的日志源", "我的日志");
Console.WriteLine("创建事件源");
Console.WriteLine("正在退出,请再次运行程序来使用日志源");
// 日志源已经被创建。退出程序来允许它被注册。
return;
}
//创建一个EventLog类实例并分配日志源.
System.Diagnostics.EventLog myLog = new System.Diagnostics.EventLog();
myLog.Source = "我的日志源";
//写入一个报告性信息到事件日志.
myLog.WriteEntry("写入事件日志");
}
二、文本文件记录日志的简单实用的日志类,
它有如下几个特点:
1)按日期每天生产不同日志文件,方便按照日期来查找日志。
2)按日志类型生产不同的文件,比如 跟踪信息、警告信息、错误信息用不同的日志文件来记录;方便我们查找指定类型的日志。
3)可以指定保持日志文件文件夹,如果不指定日志文件夹,Web应用保持到Bin文件夹,Windows Forms应用保持到.EXE文件所在的文件夹。
4)可以指定日志文件的前缀。
public class LogManager
{
private static string logPath = string.Empty;
/// <summary>
/// 保存日志的文件夹
/// </summary>
public static string LogPath
{
get
{
if (logPath == string.Empty)
{
if (System.Web.HttpContext.Current == null)
// Windows Forms 应用
logPath = AppDomain.CurrentDomain.BaseDirectory;
else
// Web 应用
logPath = AppDomain.CurrentDomain.BaseDirectory + @"bin\";
}
return logPath;
}
set{ logPath = value;}
}
private static string logFielPrefix = string.Empty;
/// <summary>
/// 日志文件前缀
/// </summary>
public static string LogFielPrefix
{
get { return logFielPrefix; }
set { logFielPrefix = value; }
}
/// <summary>
/// 写日志
/// </summary>
public static void WriteLog(string logFile, string msg)
{
try
{
System.IO.StreamWriter sw = System.IO.File.AppendText(
LogPath + LogFielPrefix + logFile + " " +
DateTime.Now.ToString("yyyyMMdd") + ".Log"
);
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: ") + msg);
sw.Close();
}
catch
{ }
}
/// <summary>
/// 写日志
/// </summary>
public static void WriteLog(LogFile logFile, string msg)
{
WriteLog(logFile.ToString(), msg);
}
}
/// <summary>
/// 日志类型
/// </summary>
public enum LogFile
{
Trace,
Warning,
Error,
SQL
}
三、数据库日志系统设计及一点思路
我们在做企业管理系统时,有多多少少都有对数据的完整性有所要求,比如要求系统不能物理删除记录,要求添加每一条数据时都要有系统记录、或者更新某条数据都需要跟踪到变化的内容、或者删除数据时需要记录谁删除了,何时删除了,以便误删后可以通过系统的XXX功能来恢复误删的数据。
我将这种功能称为操作日志
为什么要做操作日志?
其实上文也描述了一些,其主要目的就是跟踪到每一个用户在系统的操作行为,如对数据进行查询、新增、编辑或删除甚至是登录等行为。更进一步的理解可以说是对用户使用系统情况的跟踪,对数据的跟踪防止数据意外删除、更改时有所记录,有所依据,以便对数据的还原,从某种程序上可以保护数据的完整性。
系统设计
场景
我们现在有一张表叫Employee:
ID int
Name nvarchar(50)
Gender nvarchar(2)
DateCreated datetime
CreateUser nvarchar(50)
在aspx页面中可能会有EmployeeEdit.aspx(用来添加或更新Employee信息等操作),EmployeeList.aspx(用来查询或进行删除Employee信息等操作)
好了,现在我们要对Empoyee表操作的信息做一个系统日志,那怎么办?
也许你可以建立多一个表跟Employee表一模一样的,叫做EmployeeLog:
ID int
Name nvarchar(50)
Gender nvarchar(2)
DateCreated datetime
CreateUser nvarchar(50)
LogCreated datetime
OperationType int
其中加多了一些附属的信息如LogCreated(日志添加日期)和OperationType(查询、新增、删除、更新)
此时这种情况可能大家在做用户登录日志的时候是一件很常见的事件。
但……问题来了,假如我需要对表EmployeeIncome(员工的收入情况)做日志那怎么办?
好建立多一张表叫EmployeeIncomeLog来记录员工收入情况的操作日志。
假如又需要对表FixedAsset(固定资产)进行日志记录那又怎么办?
好了,大家可能意识到我们这样做不但会造成表数量的增倍,而且大大的增加了工作量和开发时间,对数据库表不易管理等情况。
因此我们需要一个能够通过简单的配置和编写就可以完成以上功能的日志管理
数据库设计
包括三个表,
LogSetting(日志设置)——用来存储配置业务表名、业务名称、主键等
LogSettingDetail(日志设置明细)——用来存储配置业务表需要记录的详细内容,如Employee表中,我们可能需要记录字段Name、Gender等信息。
LogOperation(操作日志)——用来记录用户对各种业务操作的内容情况。
下篇将讨论用代码如何实现日志管理的功能,下面先来几张图:
日志列表:
{zh1}编辑: tommyhu 编辑于2010/06/11 10:05