如何在运行在Docker容器内的.NET Core应用程序中编写日志,以便日志消息将显示在docker logs <container-id>
或者Kitematic UI?
我几乎尝试了所有方法,但最终始终无法从dotnet应用程序中获得日志。 所有其他我在容器中拥有的非dotnet应用程序,例如NODE.js、nginx、rabbitmq都可以正常记录日志。
以下是我已经尝试过的:
- 使用
Console.WriteLine
的控制台应用程序(.NET Core) - 使用ILogger接口的ASP.NET Core应用程序(使用VS模板自带Docker支持后的默认设置)
- 在控制台/ASP.NET Core应用程序中使用log4net(实际上RollingFileAppender示例中使用ConsoleAppender可以正常工作)
我无法找到任何遇到相同问题的人(stackoverflow, google, github issues),因此我认为我在这里漏掉了一些基本的东西。
更新1:
这是我的当前设置:
- Windows 10 Pro
- 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示例(由Visual Studio生成,针对ASP.NET Core)
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中,因为所有其他类型的应用程序日志都可以正常工作。