4

初始情况:有一个很大的 Winform 应用程序,有很多对话框,后台有一个 Oracle 数据库。现在需要实现审计日志功能,在某些对话框中记录用户的数据更改(之前/之后)(供公司审计部门以后审计)。您将如何集成这样的日志记录功能?顺便说一句,日志信息应该保存在数据库(历史表)中,Winform 解决方案的管理应用程序应该为日志数据提供一个浏览器对话框。

是否有现有的解决方案或框架,可以使用。在这种情况下使用像NLOG这样的日志框架是有意义的,还是从头开始实现这样一个特定的日志记录更好?

4

4 回答 4

6

我创建了一个非常简单的名为 Logger 的静态类,它只有一个方法,它接受一个字符串并使用StreamWriter记录当前的DateTime。我喜欢编写自己的日志,因为它允许我按照自己的方式格式化输出。这是我的样子的一个简短示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace LoggerSpace
{
    public static class Logger
    {
        private static StreamWriter swLog;
        private const string sLOG_FILE_PATH = "log.txt";    

        static Logger()
        {
            Logger.OpenLogger();
        }

        public static void OpenLogger()
        {
            Logger.swLog = new StreamWriter(sLOG_FILE_PATH, false);
            Logger.swLog.AutoFlush = true;
        }

        public static void LogThisLine(string sLogLine)
        {
            Logger.swLog.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + "\t:" + "\t" + sLogLine);
            Logger.swLog.Flush();
        }

        public static void CloseLogger()
        {
            Logger.swLog.Flush();
            Logger.swLog.Close();
        }
    }
}

您必须确保捕获适当的异常,并在表单关闭时调用 close 方法。再说一次,我喜欢它,因为它很简单,我可以按照自己喜欢的方式格式化它。我还看到人们在他们记录的行中从某些关键字生成空格的地方编写它。只是一个建议,有很多选择。

于 2012-05-22T16:50:37.003 回答
2

你有几个选项,没有一个包括一些人建议的系统级日志记录。

选项:

  • 如果您在数据库中有存储过程作为 CRUD 操作的接口,那么您很幸运,因为您可以在其中添加日志记录
  • 如果您没有存储过程作为数据库的接口,您仍然可以避免重新编写应用程序并在您感兴趣的表上使用触发器
  • 最后一个选项是修改应用程序代码并将日志记录插入应用程序代码本身。

每个选项都有其优点和缺点,因此在向任何方向跳跃之前,请尝试尽可能多地学习。

编辑:

为什么你不需要 Nlog 或 log4net

您不需要它们,因为从问题中很明显,您需要有关数据库中已执行事务的数据。当然,这两个日志框架都可以将数据放入数据库,但是将涉及许多额外的步骤,首先为数据库格式化数据,然后从格式化的数据中提取有关事务中涉及的实体的有用信息,并很快。

于 2012-05-22T16:42:32.930 回答
1

许多人忽略了一个事实,即 .NET 使用Trace 类内置了一个非常强大的日志记录系统。好的部分是您无需任何设置即可立即使用它,在调试窗口中获取消息,当您真正需要日志文件时,您可以设置Trace Listeners

于 2012-05-22T16:37:45.800 回答
0

当您想要记录数据更改(在数据库上)时,您应该使用数据库提供的日志功能(使用存储过程、触发器并取决于数据库产品内置功能,如SQL Server Change Data Capture),因为大多数时候您想要无论触发它的应用程序/进程(Winforms 应用程序、网站、数据库管理软件)如何,都记录该事件。

您不希望(或将原谅)在下一个新客户端应用程序上重新创建日志功能。

当您想跟踪有关应用程序使用的事件(崩溃、单击按钮、开始时间......)时,使用应用程序日志系统

授予对日志的访问权限并使其易于阅读是另一回事。

于 2015-06-26T16:21:18.123 回答