在生产中记录用户操作的最佳做​​法


22

我打算在生产环境中记录很多不同的东西,例如当用户:

  • 登录,注销
  • 变更个人资料
  • 编辑帐户设置
  • 更改密码...等

在生产环境中这样做是一种好习惯吗?还有什么是记录所有这些的好方法。我目前正在使用以下代码块登录:

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

这样可以生产吗?我的应用程序是一个非常新的应用程序,因此我不希望马上有数百万用户,或者寻找最佳实践来跟踪网站上的操作,甚至是最佳实践。


1
我可能会建议Database在文本文件上方...

@DaveZych:取决于记录的目的。如果错误跟踪/跟踪是该目的的一部分,则数据库已耗尽。见programmers.stackexchange.com/questions/92186/...
马里安Venema

我做了一个基本的实现a User Activity Logger that hooks up various events,您可以在这里看到它:stackoverflow.com/questions/30326673/…。请享用!
杰里米·汤普森

Answers:


30

这不是该问题的直接答案,更多的是扩展。

当您启动一个新应用程序时,我建议您记录用户所做的一切:登录,注销,刮擦他们的所有内容。如果是基于Web的,请考虑使用热图,这样您就可以知道他们的鼠标在做什么。

在70年代末期我在Xerox 的BravoX项目中时,我们记录了逐像素的鼠标移动,以了解用户如何使用这种称为WYSIWYG编辑器的奇怪工具。我们将在午餐期间观看用户会话的回放。这非常有启发性。我们发现了一种使用模式,称为查理·布朗宁(Charlie Browning)-用户将一些文本选择为斜体,然后将它们撤消,然后将其来回重做。事实证明,他们试图从情感上理解这些东西。因此,我们(如果有内存的话,Greg Kusnik编写了代码)进行了一些特定的优化以完全支持此行为。

没有录音,我们将永远不会想到这样做。


1
您可以仅针对此评论写一本书!
主教

这种特定类型的日志记录与实时用户体验有关,因此我不会成为作者。我是Hardcopy先生。当您单击“ 打印”时,我获取了文档的内部表示形式,将其转换为页面描述语言,然后通过名为“ 以太网”的怪异事物将其发送给了世界上第一台激光打印机。与我互动最多的小组是美国参议院印刷部和IMF的印刷小组,这是我们最好,要求最高的Beta测试站点中的2个。我从那些家伙那里学到了很多关于布局,字体等的知识。美好的时光。
彼得·罗威尔

9

如果我是你,而且我坚持写文本文件,那么我将使用log4net并登录到特定的“ UserActions.log”文件。这样,它不会混淆您的常规日志记录。通过使用log4net(或任何其他日志记录框架),您可以避免重新发明轮子并利用滚动文件附加程序,警告/错误/调试/信息代码,批处理文件编写等。将良好的日志记录构建为始终是一个好主意任何生产级别的应用程序。

但实际上,最好将所有这些信息存储在数据库中。使用数据库可以让您对其进行排序,汇总和统计。


3
您可以吃蛋糕并食用:有一个用于log4net的DatabaseAppender:logging.apache.org/log4net/release/config-examples.html。但是,如果您担心性能,则还可以登录文件并在单独的服务中解析它们,为数据进行准备以进行更快的报告(可以是报告数据库)。
绝望的鬼脸2012年

9

日志文件用于1.获取调试系统错误的信息。2.研究用户的恶作剧行为,或3.了解人们在您无法观看时如何使用系统。考虑到这一点:

  • 在应用程序启动时记录环境(例如,环境变量,其他设置等)。这对于调试问题很有帮助。
  • 记录每个请求的用户和操作(URL的不同部分)。
  • 记录每个请求的所有参数(密码除外)。我喜欢在日志中的每个参数周围放置分隔符,例如phone{(999)999-9999} email{aaa@aaa.com}。除以一种方式向数据库以外的任何地方都不得将密码写入数据库,密码安全的哈希函数具有针对每个用户的唯一盐和多轮哈希(请参阅脚注)
  • 登录时,应该记录用户的ip地址,用户ID,名称,失败登录的次数,可能是浏览器,可能是cookie会话ID,但永远不要输入密码。
  • 请记住不要将密码记录在登录页面更改密码页面上,也不要记录秘密问题或答案(如果具有此功能)。不得记录任何其他密码或加密密钥。好的做法是在日志中为这些参数写一些类似六颗星的标记,这样您就可以看到自己记得抑制这些数据。
  • 我喜欢记录服务每个请求所需的总时间: Done: 49ms
  • 我喜欢将更改记录到会话状态。这些应该很少见。
  • 就像其他人所说的那样,那里有很棒的日志记录库可以记录文件,而不是确定要记录数据库。
  • 安全地存储日志。即使没有密码,也有关于个人识别信息的州,联邦和国际法律(请参阅安全港)将日志数据保密。
  • 进行备份。如果您让它们每晚都流入全驱动器备份中,请确保在升级到新服务器之前记得将它们备份到其他位置(不要问我如何学习)。

其他技巧

脚注:要登录某人,请使用相同的哈希算法对提供的密码进行哈希处理,并从原始哈希中为该用户添加盐。如果提供的密码的哈希与存储在数据库中的密码哈希匹配,则它们将登录。为此,您必须定义密码的字符集,禁止Unicode替换字符和其他字符集。


2

您无需指定是否使用数据库,但是如果您使用的是该数据库,并且该数据库是SQL Server,则可以添加一个名为AutoAudit的文件,并自动记录与数据的所有交互。只需确保仅指定要审核的对象即可。

但是无论如何,我不会尝试手动编写跟踪代码,因为这将导致维护噩梦。

另外,对于日志记录,请不要自己动手,请使用Enterprise Library LoggingLog4Net或类似工具。


2

只是一般建议。可能与您的问题没有直接关系。

这取决于您打算将日志用于什么?日志通常用于生产中,以检测导致错误的操作。如果要保留它们来跟踪用户操作,则这不是日志的一部分。那必须是产品的服务器端功能。然后,这些东西肯定需要进入数据库供以后研究。但是服务器端日志(例如“由于某些文本为空而发生错误”)不是该功能的一部分。这些东西需要放在文件系统中。它们必须具有以下内容:-用户名,错误号,错误文本,文件名,功能名,线程ID,系统日期时间和任何其他上下文。

现在,我只谈论文件中的日志。

1)保持它们异步。I / O操作成本很高。

2)将它们设计为功能类。未来的变化将很容易。

3)如果可能,请保持单身。单例在多线程中比较困难,因此请正确设计。

4)最好还是保持记录器和loggee之间的交互简单。大多数情况下,发送的message_number比实际的message_text好,并且让记录器从该号码中获取消息。如果以后我们要更改通用日志格式,这将有所帮助。

通常,记录器以及我们需要记录的内容都应该是设计的一部分。我看到了一些案例,这些案例的设计有所变化,只是为了确保正确记录所有相关信息。


1

尝试使用Log4Net,它可以让您登录文件或数据库。这是教程

我们在所有项目中都使用Log4Net。


0

使用日志文件存在两个问题。首先,当多个进程尝试访问文件时,您可能会出错。在系统运行时尝试循环或清除文件时,也会出现问题。解决方法是使用数据库。

因此,步骤1是创建数据库表。我建议以下字段:
*用户ID
*操作(例如登录,删除foo)
*一些描述性文本(此处允许为空)
*时间戳

步骤2,使用用户ID,操作和描述性文本的输入创建存储过程。只需使用当前时间来创建时间戳。

第3步,在便利的共享库中编写一个日志记录方法,以便轻松地将其包含在任何地方,并按需进行调用该方法的实践。您可能还希望具有日志记录级别标志逻辑来更改所记录的内容。

步骤4,创建维护例程,以不时清除日志表中的旧消息。也许删除早于X的文件,每周运行一次,作为常规数据库维护(索引重建等)的一部分。

一旦构建了该代码,就应该能够使用其他项目中涉及的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.