.NET Core + Docker 部署:Serilog 日志配置与查看全攻略

 

.NET Core + Docker 部署:Serilog 日志配置与查看全攻略

作者:iamlong
关键词:.NET Core、Serilog、Docker、Linux、日志挂载、日志排查

在将 .NET Core Web API 部署到 Linux 服务器并使用 Docker 容器化运行时,日志是排查问题的“生命线”。而使用 Serilog 作为日志框架,是许多 .NET 开发者的首选。

但你是否遇到过这些问题?

  • 容器里明明写了日志,宿主机目录却是空的?
  • 本地开发正常,线上却看不到任何日志?
  • 日志路径写死后,本地开发报错?

本文将带你 彻底搞懂 Serilog 在 Docker 环境下的正确配置方式,确保日志 写得进、看得见、查得清


一、为什么日志“看不见”?

很多开发者在 appsettings.json 中这样配置 Serilog:

"WriteTo": [
  {
    "Name": "File",
    "Args": {
      "path": "Logs/app.txt",
      "rollingInterval": "Day"
    }
  }
]

然后在 docker-compose.yml 中挂载:

volumes:
  - /opt/app-logs:/app/logs

结果发现:宿主机 /opt/app-logs 目录是空的!

❌ 原因分析:

  • Logs/app.txt相对路径,实际路径是 /app/Logs/app.txt
  • 但你挂载的是 /app/logs(小写 l),而 .NET 写入的是 /app/Logs(大写 L)。
  • Linux 文件系统区分大小写,导致日志写入了容器内一个未被挂载的目录,宿主机自然看不到。

二、正确配置:统一日志路径

✅ 方案一:使用绝对路径 + 环境分离(推荐)

1. 创建 appsettings.Production.json

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/opt/app-logs/app.txt",
          "rollingInterval": "Day",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
        }
      }
    ]
  }
}

2. 本地开发用 appsettings.Development.json

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "Logs/app.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

3. 在 docker-compose.yml 中设置环境变量

version: '3.8'
services:
  my-api:
    image: my-api:latest
    ports:
      - "8080:80"
    volumes:
      - /opt/app-logs:/opt/app-logs
    environment:
      - ASPNETCORE_ENVIRONMENT=Production

✅ 这样:

  • 本地开发:日志写入项目目录 Logs/app.txt
  • 线上部署:日志写入 /opt/app-logs/app.txt,并映射到宿主机

✅ 方案二:使用相对路径 + 挂载容器内目录

如果你不想改配置,可以保持 "path": "Logs/app.txt",然后挂载容器内的 Logs 目录:

volumes:
  - /opt/app-logs:/app/Logs

⚠️ 注意:确保容器工作目录是 /app(.NET 默认是的)。


三、宿主机目录准备

在 Linux 服务器上创建日志目录,并赋权:

sudo mkdir -p /opt/app-logs
sudo chown -R 1000:1000 /opt/app-logs

1000 是容器内 .NET 进程的常见用户 ID,避免权限问题。


四、如何查看日志?

方法 1:直接查看宿主机文件

# 实时查看最新日志
tail -f /opt/app-logs/app.txt

# 搜索错误
grep -i "error\|exception" /opt/app-logs/app.txt

# 查看最近 100 行
tail -n 100 /opt/app-logs/app.txt

方法 2:进入容器查看

# 查看容器 ID
docker ps

# 进入容器
docker exec -it <container-id> cat /opt/app-logs/app.txt

五、常见问题排查

问题原因解决方案
日志目录为空 路径大小写不一致或未挂载 使用绝对路径 /opt/app-logs
写入失败 宿主机目录无写权限 chown 1000:1000 /opt/app-logs
本地开发失败 写入 /opt/... 但 Windows 无此路径 使用 appsettings.Development.json 分离配置
日志中有乱码或换行 错误信息未清理 使用 Regex.Replace(msg, @"[\x00-\x1F\x7F]", "") 清理控制字符

六、最佳实践建议

  1. 按环境分离配置:使用 Development / Production 配置文件。
  2. 使用绝对路径:避免相对路径带来的不确定性。
  3. 日志路径统一命名:如 /opt/{app-name}-logs
  4. 定期清理日志:配合 logrotate 或脚本自动清理旧日志。
  5. 不要暴露敏感信息:生产环境避免将完整异常传给前端。

结语

日志是系统运行的“黑匣子”,尤其是在容器化部署后,正确的日志配置是快速定位问题的关键

通过本文的配置方案,你可以确保:

  • ✅ 本地开发日志正常写入
  • ✅ 线上部署日志持久化到宿主机
  • ✅ 能通过 tailgrep 快速排查问题

赶快将这套方案应用到你的项目中吧!如果你觉得有用,欢迎点赞、转发,让更多 .NET 开发者少走弯路!


💬 欢迎留言讨论:你在 Docker 部署时遇到过哪些日志问题?

#NETCore #Docker #Serilog #DevOps #Linux #日志排查 #公众号技术分享


本文首发于公众号:Bug咖啡馆,转载请注明出处。


 

posted @ 2025-10-31 15:26  墨语大叔  阅读(58)  评论(0)    收藏  举报