Dockerコンテナー内で実行されている.netコアアプリケーションにログを書き込んで、ログメッセージがdocker logs <container-id>
にKitematic UIに表示されるようにするにはどうすればよいですか?
私はほとんどすべてを試しましたが、常にドットネットアプリからのログがありません。 NODE.js、nginx、rabbitmqのようなコンテナーにある他のすべての非ドットネットアプリは問題なくログを書き込みます。
これが私がすでに試したことです:
Console.WriteLine
を使用したコンソールアプリ(.NET Core)同じ問題(stackoverflow、google、githubの問題)が発生している人を見つけることができなかったので、ここで重要なものがないと思います。
これは私の現在の設定です:
動作する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にあるはずです。
思った通りです。 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
は私が経験している行動に責任があります。それなしでこのコマンドを実行すると、すべてが期待どおりに動作します。
この回答に至ったブレーンストーミングをありがとうございました。
以下を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)
);
お役に立てれば