2017-05-31 15 views
0

WebアプリケーションはAzure App Serviceでホストされています。/site/wwwroot/Log /にローカルに格納されたアプリケーションログを生成します。ログはサイズが制限されているので、log.txt(最新)、log0.txt..log20.txt(0は最長)です。Azureアプリケーションサービスからアプリケーションログをエクスポートする最も良い方法は何ですか?

チームの他のメンバーがWebアプリケーションへの書き込みアクセス権を与えずにログを利用できるようにしたいと考えています。

私はftpの読み込みアクセスを提供することを検討しましたが、それはAzureでは不可能でした。

私は数時間で実装できる非常に簡単なソリューションに加えて、全体的なソリューション(ログ解析ソリューションなど)を公開しています。予算が心配です。

ステージングスロットも使用しているため、問題が複雑になることがありますが、それは今のところ二次的な問題です。

これを行うにはどうすればよいですか?

答えて

0

チームの他のメンバーがログをウェブアプリケーションへの書き込みアクセス権を与えずに利用できるようにしたいと考えています。

Azure Web Appは、アプリケーションログを格納する2つの方法を提供します。ファイルシステムとブロブストレージ。 Blobストレージをオンにして、アプリケーションログをAzure Blobストレージに保存することができます。その後、Blobストレージに対して読み取り専用アクセスを許可する共有アクセスシグネチャ(SAS)を作成できます。

アプリケーションログブロブストレージを有効にしたくない場合は、ファイルシステムからログを読み取り、チームメンバーに共有することができます。ログファイルは "D:\ home \ LogFiles"に格納されます。 .NET Frameworkによって提供されるFileクラスとDirectoryクラスを使用して、それらを読み取ることができます。 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> 
関連する問題