使用XML文件记录操作日志

记录应用程序的操作日志可以使用数据库、文本文件、XML文件等。我这里介绍的是使用 XML 文件记录操作日志。
我觉得使用 XML 记录操作日志有如下几点好处:
1. 不占用数据库的空间,可以任意的删除历史操作日志。
2. DataTable 可以方面的读入 XML 文件,DataTable 也可以方便的保存为 XML 文件。
3. 查看日志方便,可以直接打开 XML 文件查看,也可以读入 DataTable,然后通过程序查看。

在 VS2005 中使用 XML 文件记录操作日志方法如下:
1. 建立数据集:JobLogDataSet.xsd
    这里包括:TraceLevel(日志类型)、User(用户)、DateTime(操作时间)、Module(模块)、Function(功能)、Message(消息) 6 个字段。
    不够自己再加吧, 其中 TraceLevel(日志类型) 是指 Info,Warning,Error,Trance,Off。

   

2. 建立日志类型
    /// <summary>
    
/// 日志类型
    
/// </summary>
    public enum LogType 
    { 
        
/// <summary>
        
/// 信息
        
/// </summary>
        Info, 
        
/// <summary>
        
/// 警告
        
/// </summary>
        Warning,
        
/// <summary>
        
/// 错误
        
/// </summary>
        Error, 
        
/// <summary>
        
/// 跟踪
        
/// </summary>
        Trace, 
        
/// <summary>
        
/// 不记录日志
        
/// </summary>
        Off 
    }

2. 写日志的方法
    /// <summary>
    
/// 写日志
    
/// </summary>
    
/// <param name="traceLevel">日志类型(Info,Warning,Error,Trance,Off)</param>
    
/// <param name="user">用户</param>
    
/// <param name="module">模块</param>
    
/// <param name="function">功能</param>
    
/// <param name="message">消息</param>
    public static void WriteLog(LogType logType,string user, string module, string function, string message)
    {
        
try
        {
            
// 类型为 LogType.Off 的 不记录日志
            if (logType == LogType.Off)
                
return;

            JobLogDataSet.JobLogDataTable t 
= new JobLogDataSet.JobLogDataTable();

            
// 每天一个日志文件(.XML 文件),日志的文件名称为:JobLog yyyy-MM-dd.xml
            string jobLogFile = AppDomain.CurrentDomain.BaseDirectory + "JobLog " + 
                DateTime.Today.ToString(
"yyyy-MM-dd"+ ".xml";
            
if (!File.Exists(jobLogFile))
                t.WriteXml(jobLogFile);

            
// 从 .XML 文件中读取日志
            t.ReadXml(jobLogFile);

            
// 添加一条日志
            JobLogDataSet.JobLogRow r = t.NewJobLogRow();
            r.TraceLevel 
= logType.ToString();
            r.User 
= user;
            r.Datetime 
= DateTime.Now;
            r.Module 
= module;
            r.Function 
= function;
            r.Message 
= message;
            t.AddJobLogRow(r);

            
// 保存到日志到 XML 文件
            t.WriteXml(jobLogFile);
        }
        
catch (Exception)
        {}
    }

3. 读日志的方法
    /// <summary>
    
/// 读日志
    
/// </summary>
    
/// <returns>返回读取日志的 DataTable</returns>
    public static JobLogDataSet.JobLogDataTable ReadLog()
    {
        JobLogDataSet.JobLogDataTable jobLogDataTable 
= new JobLogDataSet.JobLogDataTable();
        
try
        {
            
// 从应用程序文件夹中,获得所有日志文件 JobLog*.xml
            string[] jobLogFiles = Directory.GetFiles(
                AppDomain.CurrentDomain.BaseDirectory, 
"JobLog*.xml", SearchOption.TopDirectoryOnly);

            
// 把每个日志记录读取到日志 DataTable 中
            foreach (string jobLogFile in jobLogFiles)
            {
                
if (File.Exists(jobLogFile))
                {
                    
// 读取所有日志文件到临时 DataTable
                    JobLogDataSet.JobLogDataTable t = new JobLogDataSet.JobLogDataTable();
                    t.ReadXml(jobLogFile);
                    
// 导入日志记录到主日志 DataTable
                    foreach (JobLogDataSet.JobLogRow r in t)
                        jobLogDataTable.ImportRow(r);
                }
            }
            
// 返回读取的日志 DataTable
            return jobLogDataTable;
        }
        
catch (Exception)
        {
            
return jobLogDataTable;
        }
    }

4. 在需要写日志的地方,直接调用 WriteLog 方法即可。

本文地址:http://www.cnblogs.com/anjou/archive/2007/04/10/705986.html
Tag标签: 操作日志

posted on 2007-04-10 07:03 大豆男生 阅读(3686) 评论(25)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼 2007-04-10 08:50 李通通      

不错,不过如果日志文件过大了,读写操作会不会过慢。
如:t.ReadXml(jobLogFile);
此局是将xml整个文件读入吗?请解释下xml操作的一些运行原理吧。
  回复  引用  查看    

#2楼 2007-04-10 08:58 柠檬[未注册用户]

晕倒~使用文本记录日志的原因是,普通文本没有格式,可以直接在后面追加,哪怕日志文件再大,也没有速度问题。

然而xml是有格式的,每次追加都必须先读入全部文档,你没有考虑过效率问题么?

另外日志一般不需要删除或者用程序来读写。哪怕你真的有这样的需求,用普通文本存储的日志也一样可以轻易做到。
  回复  引用    

#3楼 2007-04-10 09:03 土人      

不错   回复  引用  查看    

#4楼 2007-04-10 09:13 Cure      

我觉得还是用txt好些,虽然把日志分成每天一个文件,但是效率仍然可能很慢,用文本只要你好好格式化一下,看起来也是很清晰的。   回复  引用  查看    

#5楼 2007-04-10 09:57 風語者·疾風      

XML做日志?小心并发I/O操作一多,会导致整个XML文件变成0字节!!!!   回复  引用  查看    

#6楼[楼主] 2007-04-10 10:37 大豆男生      

@李通通
谢谢你的支持!
t.ReadXml(jobLogFile) 是将xml整个文件读入。在 WriteLog 方法中,如果没有 t.ReadXml(jobLogFile) 这一步,就会覆盖原来的xml。在 WriteLog 方法中,先用 t.ReadXml(jobLogFile) 把日志记录读入 DataTable 中,然后在往 DataTable 中添加记录,最后再用 t.WriteXml(jobLogFile) 把 DataTable 中的数据写回到 xml 文件中。
  回复  引用  查看    

#7楼[楼主] 2007-04-10 11:07 大豆男生      

@柠檬
@Cure
谢谢你们的回复!
我以前也使用文本文件做日志的。正像你所说的,文本文件可以直接在后面追加,而xml需要读入全部文档,再添加(我写此文章时的确忽略了此问题,谢谢你的提醒)。我现在是每天一个日志文件,但是如果每天的日志量比较大的话,应该也会性能问题。应该说使用xml保存日志文件,使日志文件有了格式便于读取了,同时也牺牲了写日志的性能。
  回复  引用  查看    

#8楼[楼主] 2007-04-10 11:10 大豆男生      

@土人
谢谢你的支持!
  回复  引用  查看    

#9楼[楼主] 2007-04-10 11:17 大豆男生      

@風語者·疾風
谢谢你的回复!
你说的“并发I/O操作一多,会导致整个XML文件变成0字节!”,能有办法避免(不如加排他琐什么的)吗?
  回复  引用  查看    

#10楼 2007-04-10 15:01 防辐射孕妇装[未注册用户]

不错   回复  引用    

#11楼 2007-04-10 15:03 虚拟主机[未注册用户]

你说的很好。   回复  引用    

#12楼 2007-04-10 15:04 域名注册[未注册用户]

不错不错值得考虑。   回复  引用    

#13楼 2007-04-10 17:55 Wuya      

我觉得写日志可以考虑成这样这么一个方法:
因为XML文件本身也是一个文本文件,我们也可以直接写文本到XML文件中去,
大致过程为:
1.以二进制形式打开XML文件;
2.将文件指针定位到最后一条日志记录之后
(也就是从文件的结尾往回走XML文件的结束标记个字符数目X2)
3.写入日志文本;
4.写入XML结束标记;
5.关闭文件。
  回复  引用  查看    

#14楼 2007-04-10 18:23 随心所欲      

写xml文件的时候可以当作是写txt文件,追加<xx>xx<xx/>即可,不浪费效率。
但是用xml来做log,不好。
1:数据量。Log的数据量巨大,写文本太占地方,且速度不如数据库。比方说读取部分log,怎么作?
2:log的查询。不用说,xml绝对不如数据库。
3:log不该被删除。你认为放在xml钟可以被方便删除是不可行的。
4:log的分析。如查询一样。
  回复  引用  查看    

#15楼[楼主] 2007-04-10 20:06 大豆男生      

@Wuya
@随心所欲
谢谢2位的回复!
把xml文件的当作是写txt文件,直接追加<xx>xx<xx/>,来写日志的确是个不错的方法,提高了写日志的效率。
  回复  引用  查看    

#16楼[楼主] 2007-04-10 20:25 大豆男生      

@随心所欲
谢谢你的回复!
看的出来你是比较支持使用数据库存放日志。

我是这么认为的:
1. 大的系统Log的数据量巨大,又要对日志进行查询和分析,正如你所说的使用数据库存放日志的确不错的选择。但同时也应该注意,因为Log的数据量巨大,可能导致日志所占用的空间比实际数据占用的空间还大。
2. 如果是小程序,使用文件记日志还是比较方便的。
  回复  引用  查看    

#17楼 2007-04-11 08:33 凯恩      

轻量级应用,可以满足一般中小型企业信息化系统。另外,本例未考虑到并发应用的可以,很有可能有并发日志未被写入XML日志文件中。   回复  引用  查看    

#18楼[楼主] 2007-04-11 09:04 大豆男生      

@凯恩
谢谢你的支持!
本例是未考虑到并发的情况。我想有并发就应该加锁,怎么加锁呢?
  回复  引用  查看    

#19楼 2007-04-26 10:21 gj[未注册用户]

能不能写个方法来跟踪一个应用程序的前后,比如当前的一个字段值,和连接数据库的sql语句等等啊!??   回复  引用    

#20楼 2007-04-26 10:22 gj[未注册用户]

-
  回复  引用    

#21楼[楼主] 2007-04-26 10:46 大豆男生      

@gj
不好意思,你说的“跟踪一个应用程序的前后”对我来说有难度啊。
  回复  引用  查看    

#22楼 2007-06-03 04:57 上海笔记本维修[未注册用户]

不错不错,很不一般啊   回复  引用    

#23楼 2008-12-15 17:59 tianhu      

谢谢,参考了。。。   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 705986




相关文章:

相关链接:

导航

公告


励志照亮人生,创业改变命运!

Blog 访问量,点击这里查看如何添加访问计数器。
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔分类(117)

随笔档案(121)

收藏夹(137)

我的连接

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜