当前位置: 首页 > news >正文

.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:latestports:- "8080:80"volumes:- /opt/app-logs:/opt/app-logsenvironment:- 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咖啡馆,转载请注明出处。


 

http://www.gsyq.cn/news/35922.html

相关文章:

  • 2025年10月国内环保工程设备厂家前5名推荐榜单
  • 2025 年加药装置厂家最新推荐榜,技术实力与市场口碑深度解析,精选高适配性优质品牌加药装置/江苏加药装置公司推荐
  • 2025年10月教育资源好的学习机品牌推荐:销量榜评测报告
  • 《星球大战:克隆人战争》中的片头格言
  • matlab byte 转 bit 函数编写
  • 深入解析:嵌入式硬件——基于IMX6ULL的GPT(通用定时器)实现
  • 2025年10月教育资源好的学习机品牌推荐:实力榜全面评测
  • 2025年10月适合初中生的学习机品牌推荐:口碑榜全维度对比指南
  • 2025小型防撞与桥梁护栏企业推荐榜:聚焦实用适配的优质之选,道路防撞与桥梁护栏,桥面防撞与桥梁护栏厂家
  • nginx和微服务中网关
  • 2025 年珠海装修公司最新推荐榜,聚焦企业技术实力、服务品质与市场口碑深度解析珠海豪宅/珠海品质/珠海口碑好的/珠海大宅/珠海设计工作室推荐
  • 使用 curl 发送 POST 请求
  • 2025 年云梯车厂家最新推荐榜,技术实力与市场口碑深度解析,助力企业精准采购高空云梯车,蓝牌云梯车,拖挂式云梯车厂家推荐
  • 2025年10月防脱生发产品评价榜:国货与进口实测数据横向对比
  • 动画演示编辑距离
  • 这是一篇随笔
  • 2025 年汽车升降机,移动式升降机,提升机,登车桥厂最新推荐排行榜:技术实力与市场口碑深度解析
  • 为什么别人用 DevPod 秒启 DeepSeek-OCR,你还在装环境?
  • 2025年济南小型画室培训机构推荐精选榜单,美术生择校参考,济南画室培训机构,画室机构厂家推荐
  • 性能优化:两条SQL索引优化,CPU占用率从40%降至25%
  • 2025 科技馆运维厂家企业推荐榜:专业力量守护科普阵地,博物馆运营,民防馆运营,展馆维保厂家推荐
  • 2025实用主板板卡厂家推荐榜:聚焦中小规模优质供应商,工控主板板卡,核心板主板板卡厂家推荐
  • 2025年武汉小型车出租厂家服务商推荐榜单,实用出行参考,防撞车出租,高空车出租,登高车出租厂家推荐
  • leetcode274. H 指数
  • 2025年BAB筑垒建设公司权威深度解析:北京写字楼装修业测评与未来趋势揭秘
  • 2025 年最新推荐:货梯源头厂家排行榜 防爆 / 升降 / 仓库 / 载货电梯靠谱品牌精选
  • 边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
  • Pinely Round 5 (Div.1 + Div.2)
  • 【新特性】 版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年10月发布)
  • 2025年10月绩效管理咨询公司推荐:实力榜评价