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