C# 登录Winform应用程序

C# 登录Winform应用程序,c#,winforms,logging,auditing,C#,Winforms,Logging,Auditing,初始情况:有一个大型Winform应用程序,有许多对话框,后台有一个Oracle数据库。现在需要实现审计记录功能,该功能在某些对话框中记录用户(用于公司审计部门的后续审计)在之前/之后的数据更改()。您将如何集成这样的日志功能?顺便说一下,日志信息应该保存在数据库(历史记录表)中,Winform解决方案的管理应用程序应该为日志数据提供一个浏览器对话框 是否存在可以使用的现有解决方案或框架。在这种情况下,使用像NLOG这样的日志框架是有意义的,还是从头开始实现这样一个特定的日志记录更好?许多人忽略

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


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

许多人忽略了.NET使用。很好的一点是,您可以在不进行任何设置的情况下立即使用它,在调试窗口中获取消息,并且当您实际需要日志文件时,您可以进行设置。

您有几个选项可供选择,其中没有一个选项包括一些建议的系统级日志记录

选项:

  • 如果您在数据库上有作为CRUD操作接口的存储过程,那么您很幸运,因为您可以在那里添加日志记录
  • 如果没有存储过程作为数据库的接口,仍然可以避免对应用程序重新编码,并对感兴趣的表使用触发器
  • 最后一个选项是修改应用程序代码并将日志记录插入应用程序代码本身
每种选择都有它的优点和缺点,所以在向任何方向跳跃之前,尽可能多地学习

编辑:

为什么不需要Nlog或log4net


您不需要它们,因为从问题中可以明显看出,您需要数据库中有关已执行事务的数据。当然,这两个日志框架都能够将数据放入数据库,但首先需要对数据库的数据进行格式化,然后从格式化的数据中提取有关事务中涉及的实体的有用信息,等等。我创建了一个非常简单的静态类Logger,它只是有一个方法,该方法接受一个字符串并使用。我喜欢写我自己的日志,因为它允许我按照我想要的方式格式化输出。下面是一个简短的示例,展示了我的产品:

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方法。同样,我喜欢它,因为它很简单,而且我可以按照我喜欢的方式格式化它。我也看到过人们在日志行中的某些关键字生成空格的情况。只是一个建议,有这么多选项。

当您想要记录数据更改(在数据库上)时,您应该使用数据库提供的日志功能(使用存储过程、触发器和数据库产品内置的功能,如),因为大多数时候您想记录事件,而不管应用程序/进程如何(Winforms应用程序、网站、数据库管理软件)触发它

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

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


允许访问日志并使其可读是另一回事。

您可以尝试Log4net或Microsoft Logging Application Block。我个人使用Log4net包装了自己的特定代码,以减少记录消息所需的行数。我的代码查找登录用户,并添加一些对我的ap有意义的其他常见信息应用程序。通过仔细的设置工作,您不会失去log4net对日志记录的任何细粒度控制。这一点并不明显。事实上,OP说“在某些对话框中”需要日志记录,这意味着要求不是记录所有更改,而是只记录特定对话框中的更改。在数据库级别安装日志记录要比集成log4net这样的框架困难得多。我绝对相信这会更加困难,但记录的数据应该进入数据库,以便审阅者查看。记录的数据应该进入数据库database?当然。应该在表级别进行日志记录?这是我不同意的部分。应该在应用程序中有意义的地方进行日志记录。请重新阅读OPs问题。您计划如何将日志数据分发给审计部门,而不是通过熟悉的应用程序,从而从实际数据库本身读取数据。我不是su你明白我的意思了吗?当然,在方便的地方存储日志——我同意你的观点,数据库在这方面是有意义的。但这并不一定意味着你应该使用数据库引擎在数据层执行日志记录。日志记录框架,如集成到应用程序本身中的log4net,可能更有用,取决于应用程序。它将允许您记录用户在做什么,用户在哪个屏幕上,等等,而不仅仅是记录数据库中发生的更改。在我被介绍到nLog之前,我做过这样的事情。看看它,它足够简单,并且具有您需要的所有功能(格式化)。简单有效!好主意;)