如何在多個應用程式中共用紀錄檔設定

2023-01-03 12:02:00

有的時候你有多個應用程式,它們需要使用相同的紀錄檔設定。在這種情況下,你可以將紀錄檔設定放在一個共用的位置,然後通過專案檔案快速參照。方便快捷,不用重複設定。

Directory.Build.props

通過在專案資料夾中建立一個名為 Directory.Build.props 的檔案,可以將設定應用於所有專案。這個檔案的內容如下:

<Project>
    <ItemGroup Condition="$(MyApplication) == 'true'">
        <Content Include="..\Shared\appsettings.logging.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
            <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
            <Link>Shared\appsettings.logging.json</Link>
        </Content>
    </ItemGroup>
</Project>

我們可以將這個檔案放在解決方案資料夾的根目錄中,這樣就可以將設定應用於所有專案。

由於我們定義了一個條件,所以我們可以通過設定 MyApplication 屬性來控制是否應用這個設定。在這個例子中,我們將 MyApplication 屬性設定為 true,所以我們只要在專案檔案中設定這個屬性,就可以應用這個設定。

專案檔案

在專案檔案中,我們需要設定 MyApplication 屬性,然後參照 Directory.Build.props 檔案。這樣就可以應用 Directory.Build.props 檔案中的設定了。

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
        <MyApplication>true</MyApplication>
    </PropertyGroup>
</Project>

appsettings.logging.json

Shared 資料夾中,我們需要建立一個名為 appsettings.logging.json 的檔案,這個檔案就是我們的紀錄檔組態檔。這個檔案的內容如下:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
        }
      }
    ]
  }
}

使用 appsettings.logging.json

Program.cs 檔案中,我們需要將紀錄檔組態檔的路徑傳遞給 CreateHostBuilder 方法。這樣就可以使用 appsettings.logging.json 檔案中的設定了。

private void LoadSharedAppSettings(WebApplicationBuilder builder)
{
    var appsettingsParts = new[] { "logging" };
    var sharedBaseDir = Path.Combine(AppContext.BaseDirectory, "Shared");
    foreach (var appsettingsPart in appsettingsParts)
    {
        builder.Configuration.AddJsonFile(Path.Combine(sharedBaseDir, $"appsettings.{appsettingsPart}.json"),
            true, true);
        builder.Configuration.AddJsonFile(
            Path.Combine(sharedBaseDir,
                $"appsettings.{appsettingsPart}.{builder.Environment.EnvironmentName}.json"),
            true, true);
    }
}

資料夾結構

最後我們看一下資料夾的結構:

├───MyApplication1
│   ├───Properties
│   └───wwwroot
├───MyApplication2
│   ├───Properties
│   └───wwwroot
├───Shared
│   └───appsettings.logging.json
└───MyApplication.sln

總結

通過在專案資料夾中建立一個名為 Directory.Build.props 的檔案,可以將設定應用於所有專案。在專案檔案中,我們需要設定 MyApplication 屬性,然後參照 Directory.Build.props 檔案。在 Program.cs 檔案中,我們需要將紀錄檔組態檔的路徑傳遞給 CreateHostBuilder 方法。這樣就可以使用 appsettings.logging.json 檔案中的設定了。

參考資料

  • Directory.Build.props[1]
  • appsettings.json[2]
  • 本文作者: newbe36524
  • 本文連結: https://www.newbe.pro/ChatAI/0x015-How-to-share-logging-configuration-in-multiple-applications/
  • 版權宣告: 本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協定。轉載請註明出處!

參考資料

[1]

Directory.Build.props: https://learn.microsoft.com/visualstudio/msbuild/customize-your-build?view=vs-2022&WT.mc_id=DX-MVP-5003606#directorybuildprops-and-directorybuildtargets

[2]

appsettings.json: https://learn.microsoft.com/aspnet/core/fundamentals/configuration/?view=aspnetcore-7.0&WT.mc_id=DX-MVP-5003606#appsettingsjson