在 Docker 容器外部暴露日志文件

4
我有一个使用Serilog作为日志框架的.net core应用程序,目前Serilog正在记录到文件中。我想将此文件暴露在容器外,并像其他文件一样简单地访问它。我尝试了卷和卷绑定,根据docker-compose参考:https://docs.docker.com/compose/compose-file/#volume-configuration-reference。此外,来自主机的目录是共享的。但是日志文件出现在特定目录的容器中,但是主机上的目录仍然为空。我可以使用DOCKER COPY命令手动复制此文件。是否有任何方法使该文件在主机上的我的卷目录中同步?或者我应该采用其他额外的方法(例如ELK)来实现我的目标?这是我的docker-compose文件。前端部分现在因测试而被注释掉了。
version: '3.7'

services:
  backend:
    build: './backend'
    ports:
      - "80:80"
    networks:
      - gateway
    environment:
      - Logger:FilePath=//logs//logs.txt
      - Database:Name=Data Source = ./database.db
    volumes:
      - type: bind
        source: /Users/grzegorz/Desktop/logs
        target: /app/logs/
  #frontend:
  #  build: './frontend'
  #  depends_on:
  #    - backend
  #  ports:
  #    - "4200:4200"
  #  networks:
  #    - gateway

networks:
  gateway: {}

当我打开终端并进入app/logs目录时,我可以看到名为logs.txt的文件,其中包含当前应用程序的日志。

你能展示一下你的dockerfile/compose以及挂载卷的方法吗?如果你在本地没有使用docker就启动应用程序,并且可以访问日志文件,那么你的挂载/绑定配置可能存在问题。你应该能够将某个主机目录绑定到容器目录,以便能够访问日志文件。 - Michał Krzywański
@michalk docker-compose 已经完成了。 - GrzesiekO
1个回答

2
你正在挂载/app/logs,但环境变量表明日志写入的路径是/logs,而不是/app/logs。
更改其中一个路径,看看问题是否仍然存在。
一般来说,你的方法是正确的。但对于生产环境,特别是在集群环境中,最好使用Serilog、Splunk、Application Insights或其他基于服务的日志收集器,因为当你扩展容器时,文件可能难以维护。

我将日志目录从/app/logs更改为/logs,现在日志位于主机的共享目录中。此应用程序中实现了Serilog。mount-volume仅用于开发目的。 - GrzesiekO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接