【问题标题】:Application logging architecture应用程序日志架构
【发布时间】:2011-12-08 07:29:06
【问题描述】:

我正在编写一个 ASP .NET MVC3 应用程序,由于应用程序应该是安全的,我需要一个良好的企业应用程序日志架构。

所以我在寻找现有的登录框架并选择了NLog。所以在他们那一刻,我坚持为日志制作数据库架构。

有人在这方面有很好的经验吗?预计会记录一组操作,例如用户与系统对象的交互、后台工作、用户成员操作、支付交易等。

【问题讨论】:

    标签: c# .net asp.net-mvc asp.net-mvc-3 nlog


    【解决方案1】:

    我使用 NLog 已经有一段时间了,我对它非常满意。我最喜欢 NLog 的地方在于您可以配置不同的日志级别以写入不同的文件和/或数据库。这是一个非常强大的日志库。

    要记录到数据库,您可以在配置中使用如下所示的内容。这类似于我在我工作的公司使用的。

    <target xsi:type="Database" 
            name="TestDatabaseLogging" 
            connectionString="Data Source=127.0.0.1;Initial Catalog=NLog_Test;User ID=MyLogin;Password=MyPassword" 
            dbDatabase="NLog_Test">
      <commandText>
        insert into INNO_LOG ([createDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @exception, @stackTrace)
      </commandText>
      <parameter name="@createDate" layout="${date}"/>
      <parameter name="@origin" layout="${callsite}"/>
      <parameter name="@logLevel" layout="${level}"/>
      <parameter name="@message" layout="${message}"/>
      <parameter name="@exception" layout="${exception:format=Message,StackTrace}"/>
      <parameter name="@stackTrace" layout="${stacktrace}"/>
    </target>
    

    您可以使用规则部分将不同级别记录到不同的文件中,请参见下面的示例;

      <rules>
        <logger name="*" minlevel="Fatal" writeTo="mail" />
        <logger name="*" minlevel="Error" writeTo="TestDatabaseLogging" />
        <logger name="*" minlevel="Debug" writeTo="file-debug" />
        <logger name="*" minlevel="Info" writeTo="file" />
        <!--Log to specific files for specific classes.-->
        <logger name="_Default" minlevel="Trace" writeTo="file-default" />
        <logger name="TestClass" minlevel="Trace" writeTo="file-testclass" />
      </rules>
    

    编辑:为记录信息添加了可能的表格布局。

    Id | int
    CreateDate | datetime
    LogLevel | nvarchar
    Message | nvarchar(max)
    Exception | nvarchar(max)
    StackTrace | nvarchar(max)
    SourceUrl | nvarchar(255)
    UserId | uniqueidentifier
    OrderId | int
    

    上面的布局只是一个粗略的想法。这完全取决于您要在此表中登录的内容。尽管您必须尝试是否可以添加除 NLog 默认使用的参数之外的其他参数。

    【讨论】:

    • 您的方式就像处理异常情况(例如根本无法连接到数据库或类似情况)。但是对于“用户已成功登录”这样的情况,我该怎么办?
    • 我会为此使用信息级别。然后,您可以执行类似 _logger.info("user: *** failed logged in.") 之类的操作。在配置中,您可以确定将信息记录到数据库或文件中。就个人而言,我总是假设某些东西有效,所以我从不记录它。我只记录例外情况,例如发生错误或用户经常尝试使用错误密码登录时。
    • 为什么要记录“用户已成功登录”之类的信息?
    • 我认为登录比不登录要好 :) 了解用户的典型行为可能会很有用,例如,未来如何使系统变得更好。
    • NLog 是正确的方法。我们将它与 Splunk 相结合,以实现一些非常强大的信息检索。
    【解决方案2】:

    就像 Rob 已经回答了 .. 坚持使用 NLog :)

    如果您需要一个好的查看器,别忘了使用Sentinal 作为免费的 nLog 查看器 :)

    不要忘记,您可以在生产中以编程方式打开日志记录部分......以查看网站的特定区域。然后使用 Sentinal 实时查看它们。


    另一种选择是利用LoggR.net 之类的东西。这会实时传输数据(即本例中的错误或日志信息)。我认为它使用了很棒的 SignalR 框架来使用 WebSockets 或长轮询(2 种实时技术):)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多