从Azure应用服务导出应用程序日志的最佳方法是什么?

时间:2017-05-31 16:10:47

标签: azure azure-web-app-service

我们的网络应用程序托管在Azure App Service上。它生成本地存储在/ site / wwwroot / Log /的应用程序日志。日志大小有限,因此我们有log.txt(最新),log0.txt..log20.txt(0是最旧的)。

我希望将日志提供给团队的其他成员,而不向他们提供对Web应用程序的ftp写访问权限。

我探讨了提供ftp读访问权限,但Azure无法实现。

我对能够在几个小时内实施的非常简单的解决方案以及整体解决方案(日志分析解决方案等)持开放态度。预算是一个问题。

我们也使用临时插槽,这可能会使问题复杂化,但现在是次要问题。

我怎样才能做到最好?

1 个答案:

答案 0 :(得分:0)

  

我希望将日志提供给团队的其他成员,而不向他们提供对Web应用程序的ftp写入权限。

Azure Web App提供了两种存储应用程序日志的方法。文件系统和Blob存储。您可以打开Blob存储以将应用程序日志保存到Azure Blob存储。之后,我们可以创建一个共享访问签名(SAS),它可以授予Blob存储的只读访问权限。

如果您不想打开“应用程序日志Blob存储”,则可以从文件系统中读取日志并将其共享给您的团队成员。日志文件存储在" D:\ home \ LogFiles"中。我们可以使用.NET Framework提供的文件和目录类来读取它们。我创建了一个ASP.NET MVC示例代码来完成它。以下代码供您参考。

将用于传递文件夹和文件信息以查看的模型。

public class LogFolder
{
    public LogFolder() { }

    public LogFolder(string virtualPath)
    {
        FolderVirtualPath = virtualPath;
    }

    public string FolderName
    {
        get
        {
            int lastIndex = FolderVirtualPath.LastIndexOf(@"\");
            if (lastIndex < 0 && FolderVirtualPath.Length > 0) { return FolderVirtualPath; }
            else { return FolderVirtualPath.Substring(lastIndex + 1); }
        }
    }

    public string FolderVirtualPath { get; set; }

    public string FolderPath {
        get
        {
            return Path.Combine(@"D:\home\LogFiles\", FolderVirtualPath);
        }
    }

    public List<LogFolder> SubFolders { get; set; }

    public List<LogFile> SubFiles { get; set; }

    public void GetSubFilesAndFolders()
    {
        SubFolders = new List<LogFolder>();
        IEnumerable<string> folders = Directory.EnumerateDirectories(FolderPath);
        foreach (var folder in folders)
        {
            SubFolders.Add(new LogFolder(folder.Replace(@"D:\home\LogFiles", "")));
        }
        SubFiles = new List<LogFile>();
        IEnumerable<string> files = Directory.EnumerateFiles(FolderPath);
        foreach (var file in files)
        {
            SubFiles.Add(new LogFile(file.Replace(@"D:\home\LogFiles", "")));
        }
    }
}

public class LogFile
{
    public LogFile() { }

    public LogFile(string virtualPath)
    {
        FileVirtualPath = virtualPath;
    }

    //Used to display the file name
    public string FileName { get { return Path.GetFileName(FilePath); } }

    public string FileVirtualPath { get; set; }

    //used to download the file
    public string FilePath
    {
        get { return Path.Combine(@"D:\home\LogFiles\", FileVirtualPath); }
    }
}

用于显示文件夹信息和从服务器端下载文件的控制器。

public ActionResult Folder(string folderVirtualPath)
{
    LogFolder folder = new LogFolder(folderVirtualPath);
    folder.GetSubFilesAndFolders();
    return View(folder);
}

public ActionResult DownloadFile(string fileVirtualPath)
{
    LogFile file = new LogFile(fileVirtualPath);
    if (System.IO.File.Exists(file.FilePath))
    {
        return File(System.IO.File.ReadAllBytes(file.FilePath), "application/octet-stream", file.FilePath);
    }
    else
    {
        return HttpNotFound("File Not Found");
    }   
} 

查看用于显示文件夹信息的内容。

@model TestAccessFIles.Controllers.LogFolder
@{
    ViewBag.Title = "Folder";
}

<h2>Folder : @Model.FolderVirtualPath </h2>

<h3>Sub Folders</h3>
<ul>
@foreach (var folder in Model.SubFolders)
{
    <li><a href="@Url.Action("Folder",new { folderVirtualPath = folder.FolderVirtualPath })">@folder.FolderName</a></li>
}
</ul>

<h3>Sub Files</h3>
<ul>
    @foreach (var file in Model.SubFiles)
    {
        <li><a href="@Url.Action("DownloadFile",new { fileVirtualPath = file.FileVirtualPath })">@file.FileName</a></li>
    }
</ul>