Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录部署到Azure的.Net的首选方式_.net_Logging_Azure - Fatal编程技术网

登录部署到Azure的.Net的首选方式

登录部署到Azure的.Net的首选方式,.net,logging,azure,.net,Logging,Azure,您认为在Azure部署的应用程序中执行简单传统日志记录的最佳方式是什么 如果你觉得需要做很多工作才能找到文件等等 什么最适合您?我们使用写入Azure表存储的内置诊断。任何时候我们需要将消息写入日志,它只是一个“Trace.WriteLine(…)” 由于日志是写入Azure表存储的,因此我们有一个过程可以下载日志消息,并将其从表存储中删除。这对我们来说很好,但我认为这可能取决于应用程序 希望有帮助 [更新] public void GetLogs() { int cnt =

您认为在Azure部署的应用程序中执行简单传统日志记录的最佳方式是什么

如果你觉得需要做很多工作才能找到文件等等


什么最适合您?

我们使用写入Azure表存储的内置诊断。任何时候我们需要将消息写入日志,它只是一个“Trace.WriteLine(…)”

由于日志是写入Azure表存储的,因此我们有一个过程可以下载日志消息,并将其从表存储中删除。这对我们来说很好,但我认为这可能取决于应用程序

希望有帮助

[更新]

public void GetLogs() {
        int cnt = 0;
        bool foundRows = false;
        var entities = context.LogTable;
        while (1 == 1) {
            foreach (var en in entities) {
                processLogRow(en);
                context.DeleteObject(en);
                cnt++;
                try {
                    if (cnt % 100 == 0) {
                        foundRows = true;
                        context.SaveChanges(SaveChangesOptions.Batch);
                    }
                } catch (Exception ex) {
                    Console.WriteLine("Exception deleting batch. {0}", ex.Message);
                }
            }
            if (!foundRows)
                break;
            else {
                context.SaveChanges(SaveChangesOptions.Batch);
            }
            foundRows = false;
        }
        Console.WriteLine("Done! Total Deleted: {0}", cnt);
    }

给Brosto的答案增加一点:只需几行代码即可配置Azure诊断。您可以决定要捕获的级别(详细、信息性等)。以及您希望将本地缓存的日志消息推送到Azure存储的频率(我通常每隔15分钟一次)。然后,来自所有实例的日志消息聚合到同一个表中,可以轻松地查询(或下载),属性定义角色和实例

还有其他跟踪语句,如trace.TraceError()、trace.TraceWarning()等


您甚至可以创建跟踪侦听器,并在本地计算机上几乎实时地查看日志输出。示例zip包含一个用于执行此操作的示例(在\ServiceBus\Scenarios\CloudTrace下)。

如前所述,使用Windows Azure诊断是一种方法。然而,来自所有实例的所有日志记录最终都会出现在一个大列表中,这可能很难通读。因此,我尝试只向诊断表发送相对重要的消息(警告级别和更高级别)。即便如此,直接阅读表格也是一件痛苦的事情。有一些工具,我个人使用的是脑波数据诊断管理器

虽然直接使用跟踪函数可以很好地工作,但我建议使用诸如NLog或log4net之类的日志框架。这使您可以更灵活地将一些消息(跟踪/Azure诊断)和其他消息发送到本地存储


例如,我添加了大量跟踪日志来跟踪线程挂起问题。我发现,给定根相对文件路径,如“\ServiceLogs\MyLog.txt”,将输出到实例上的F:驱动器。所以我将所有这些路由到实例文件系统,而不是诊断表。您必须远程访问每个实例才能查看这些日志,但在这种情况下,这是一个很好的折衷办法。

我使用企业库5.0日志应用程序块指向Azure诊断监视器跟踪侦听器


对于错误日志记录,我看到的最佳解决方案是。它需要SQL数据库,但这是一个错误日志记录工具,实际上可以帮助诊断问题。它在Azure上运行良好。

对于我所有的Azure站点,我都使用自定义的Azure表日志记录。虽然需要做更多的工作,但我发现它让我能够更好地控制存储的信息。正如上面Brosto所评论的,最好有一个本地进程,定期将日志下载到本地系统。如果从
TableServiceEntity
派生一个类,则可以定义一个包含所有要记录的字段的结构,并使用同一个类来检索本地应用程序中检索日志的数据。如果对任何人都有帮助,我会在我的页面上维护一些代码示例

我在使用
Trace.Writeline
方法时遇到的一个问题是,日志存储在本地实例上,并定期传输到Azure表存储。考虑到Azure实例的暂时性,所有本地存储充其量只能被视为临时存储。因此,当日志数据保存在本地驱动器上时,始终存在丢失日志数据的窗口


考虑到Azure表存储事务的成本,直接登录Azure存储非常经济高效。如果性能对您来说是一个主要问题,那么使用一个单独的线程(或多个线程)来为日志数据的内存队列提供服务可能是值得的。虽然如果Azure实例被回收,这显然会给瞬态数据带来类似的问题,但发生这种情况的窗口应该小得多。

虽然不是传统的日志框架,但当您真正想要读取日志时,它确实能帮到您,它“使”您写入所有日志(并添加其他相关信息)所以当你以后需要阅读时,你会得到你所需要的一切

它还支持将日志持久化到Azure表存储


有更多的信息和示例。

下载程序代码是否有可能被发布在某个地方?我正准备做一些类似的事情。完整的代码没有发布在任何地方,但我会用下载日志的主循环更新这篇文章。这应该会让你了解它是如何工作的。这个答案只提到了解决问题的一种方法。通常,您会以滚动方式登录到磁盘,只保留最新数据,还可以登录到当前无法滚动数据的Azure存储帐户。此外,到目前为止,建议使用EventSource(ETW)而不是Systems.Diagnostics.Trace,因为您也可以通过ETW控制格式。此代码具有严重的“坏代码”气味…:/我甚至可以说我在这里看到了一个bug。对于任何数量<100的实体,SaveChanges都不会被调用。当代码不干净时会发生这种情况。可能是在程序员处。stackexchange也很有用。您可以配置ELMAH以使用表存储。例如,见