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

从Azure应用程序服务导出应用程序日志的最佳方法是什么?,azure,azure-web-app-service,Azure,Azure Web App Service,我们的web应用程序托管在Azure应用程序服务上。它生成本地存储在/site/wwwroot/Log/的应用程序日志。日志大小有限,因此我们有log.txt(最新)、log0.txt..log20.txt(0最旧) 我想让团队的其他成员可以使用这些日志,而不给他们对web应用程序的ftp写访问权 我探索过提供ftp读取访问,但在Azure中这是不可能的 我愿意在几个小时内实施非常简单的解决方案以及整体解决方案(日志分析解决方案等)。预算是一个问题 我们也使用暂存槽,这样可能会使事情复杂化,但这

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

我想让团队的其他成员可以使用这些日志,而不给他们对web应用程序的ftp写访问权

我探索过提供ftp读取访问,但在Azure中这是不可能的

我愿意在几个小时内实施非常简单的解决方案以及整体解决方案(日志分析解决方案等)。预算是一个问题

我们也使用暂存槽,这样可能会使事情复杂化,但这是目前的次要问题

我怎样才能做到最好

我想让团队的其他成员可以使用这些日志,而不给他们对web应用程序的ftp写访问权

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

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

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

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>
用于显示文件夹信息的视图。

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>
@model TestAccessFIles.Controllers.LogFolder
@{
ViewBag.Title=“文件夹”;
}
文件夹:@Model.FolderVirtualPath
子文件夹
    @foreach(Model.SubFolders中的var文件夹) {
  • }
子文件
    @foreach(Model.SubFiles中的var文件) {
  • }