web-dev-qa-db-ja.com

DockerコンテナーでのASP.NET Core / .NET Core Consoleアプリのログ記録

Dockerコンテナー内で実行されている.netコアアプリケーションにログを書き込んで、ログメッセージがdocker logs <container-id>にKitematic UIに表示されるようにするにはどうすればよいですか?

私はほとんどすべてを試しましたが、常にドットネットアプリからのログがありません。 NODE.js、nginx、rabbitmqのようなコンテナーにある他のすべての非ドットネットアプリは問題なくログを書き込みます。

これが私がすでに試したことです:

  • Console.WriteLineを使用したコンソールアプリ(.NET Core)
  • ILoggerインターフェイスを使用したASP.NET Coreアプリ(Dockerサポート付きのVSテンプレートを使用した後のデフォルト設定)
  • consoleAppenderでconsole/ASP.NET Coreアプリ内でlog4netを使用する(ロギングは実際にはRollingFileAppenderなどで機能します)

同じ問題(stackoverflow、google、githubの問題)が発生している人を見つけることができなかったので、ここで重要なものがないと思います。

更新1:

これは私の現在の設定です:

  • ウィンドウズ10プロ
  • Docker for Windows 17.12.0-ce
  • docker-composeバージョン1.18.0、ビルド8dd22a96
  • linuxコンテナーの実行

更新2:

動作するDockerfileの例(NodeJSアプリ)

FROM node:9-slim
WORKDIR /app
EXPOSE 80

ENV NODE_PATH=/node_modules
ENV PATH=$PATH:/node_modules/.bin

COPY ./MyApp ./
RUN npm install
RUN npm run build
CMD [ "npm", "start" ]

機能していないDockerfileの例(ASP.NET Core、Visual Studioによって生成)

FROM Microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM Microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY DockerLoggingTest2/DockerLoggingTest2.csproj DockerLoggingTest2/
RUN dotnet restore
COPY . .
WORKDIR /src/DockerLoggingTest2
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DockerLoggingTest2.dll"]

ご覧のとおり、特別なことは何もありません。他のタイプのアプリケーションログはすべて問題ないため、問題は.NET Coreにあるはずです。

6
Radek Stromský

思った通りです。 Visual Studioは、すべてのログメッセージを飲み込む真ん中の人です。おそらくすべてのデバッグ機能を有効にするためにVisual Studioが呼び出すdocker-composeコマンドのyamlオーバーライドと関係があると思います。

docker-compose  -f "docker-compose.yml" -f "docker-compose.override.yml" -f "obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose2788718473649893946 up -d --force-recreate --remove-orphans

次のファイルのようですobj\Docker\docker-compose.vs.debug.g.ymlは私が経験している行動に責任があります。それなしでこのコマンドを実行すると、すべてが期待どおりに動作します。

この回答に至ったブレーンストーミングをありがとうございました。

4
Radek Stromský

以下をappsettings.jsonに追加

  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console": {
      "IncludeScopes": true
    }
  }

yourProject.csproj内でappsettingsをコピーするようにプロジェクトが構成されていることを確認してください。

  <ItemGroup>
    <Content Include="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

次に、設定をロギングサービスに追加しました。

            services.AddLogging(builder =>
                builder
                    .AddDebug()
                    .AddConsole()
                    .AddConfiguration(configuration.GetSection("Logging"))
                    .SetMinimumLevel(LogLevel.Information)
            );

お役に立てれば

1
Jared Onnen