从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示例代码来实现它。以下代码仅供参考 用于传递文件夹和文件信息以供查看的型号。从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中这是不可能的 我愿意在几个小时内实施非常简单的解决方案以及整体解决方案(日志分析解决方案等)。预算是一个问题 我们也使用暂存槽,这样可能会使事情复杂化,但这
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文件)
{
}