在Winform应用程序中登录

4

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

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


2
你可以尝试使用Log4net或Microsoft Logging Application Block。 - Asif Mushtaq
我个人使用log4net并用自己特定的代码进行包装,从而减少记录消息所需的行数。我的代码查找已登录的用户,并添加其他对于我的应用程序有意义的常见信息。通过一些仔细的设置工作,您不会失去log4net对于日志记录的精细控制能力。 - Katie Kilian
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方法。我喜欢它,因为它简单易懂,而且我可以按照自己的喜好进行格式化。我也看到过有些人将空格生成在他们记录的某些关键字的行中。这只是一个建议,因为有很多选择。


1
在我接触到nLog之前,我曾经做过这样的事情。你可以研究一下它,它足够简单并且拥有你所需的所有功能(格式化)。 - Daniel Mošmondor
简单而有效! 好主意 ;) - Vito Gentile

2
你有几个选项可供选择,但都不包括一些人建议的系统级日志记录。
选项:
- 如果你在数据库上有作为CRUD操作接口的存储过程,那么你很幸运,因为你可以在那里添加日志记录。 - 如果你没有存储过程作为数据库接口,你仍然可以避免重新编写应用程序,并在你感兴趣的表上使用触发器。 - 最后一个选项是修改应用程序代码并将日志记录插入应用程序代码本身。
每个选项都有其优点和缺点,所以在任何方向上跳跃之前,请尽可能多地了解。
编辑: 为什么你不需要Nlog或log4net 你不需要它们,因为从问题中显然你需要关于在数据库中执行的事务的数据。当然,这两个日志框架都能够将数据放入数据库中,但是会涉及许多额外步骤,首先格式化数据以适合数据库,然后从格式化数据中提取有关参与事务的实体的有用信息等。

这一点毫不明显。事实上,OP表示需要在“某些对话框”中记录日志,这意味着要求不是记录所有更改——只记录特定对话框中的更改。在数据库层面安装日志记录比集成像log4net这样的框架要困难得多。 - Katie Kilian
我非常确定这会更难,但是记录的数据应该无论如何都要进入数据库供审阅者查看。 - Daniel Mošmondor
记录的数据应该进入数据库吗?当然可以。日志记录应该在表级别完成吗?这是我不同意的部分。日志记录应该在应用程序中有意义的地方完成。 - Katie Kilian
请重新阅读原帖的问题。如何比通过熟悉的应用程序更好地将日志数据分发给审计部门,从而直接从实际数据库中读取数据。 - Daniel Mošmondor
我不确定你是否理解我的意思。当然,将日志存储在方便的地方 - 我同意您对此使用数据库的想法。但这并不一定意味着您应该在数据层中使用数据库引擎进行记录。根据应用程序,集成到应用程序本身中的log4net等日志框架可能更有用。它将允许您记录用户正在做什么,用户在哪个屏幕上等,而不仅仅是记录数据库中发生了什么变化。 - Katie Kilian
是的,你说得完全正确。但你觉得他们想记录数据的变化吗?这样他们就可以拥有整个文档的历史记录、对其所做的更改的日志等等…… - Daniel Mošmondor

1
很多人忽略了一个事实,那就是.NET内置了一个相当强大的日志记录系统,使用Trace类即可。好处在于您可以立即使用它而无需进行任何设置,在调试窗口中获取消息,并且当您实际需要日志文件时,可以设置Trace Listeners

0

当您想要记录数据更改(在数据库上)时,应使用数据库提供的日志功能(使用存储过程、触发器和依赖于数据库产品的内置功能,如SQL Server Change Data Capture),因为大多数情况下,您希望记录事件而不管触发它的应用程序/进程(Winforms应用程序、网站、数据库管理软件)。

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

当您想要跟踪有关应用程序使用的事件(崩溃、单击按钮、启动时间等)时,请使用应用程序日志系统。

提供访问日志并使其易于阅读是另一回事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接