首页 > 技术文章 > AspNetcore搭配Serilog利用docker发布CentOs7

roluodev 2020-08-30 14:18 原文

前言:

本文主要是想观察AspnetCore通过serilog输出日志文件,在docker部署的情况下日志文件的存放问题

1、新增一个名为PublishAspNetCore3.1WithDocker的AspNetCoreWebApi项目

1.1 安装serilog

安装以下两个Nuget包

Serilog.AspNetCore

Serilog.AspNetCore

1.2 修改Program.cs

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }).UseSerilog((context, configure) =>
            {
                configure.ReadFrom.Configuration(context.Configuration);
            });

1.3 修改appsettings.json

配置Serilog 输出到文件和Console。

此处要注意一点

pathFormat" 的路径为相对路径,且最好用/ 左斜杆来标识路径,否则,用\右斜杆在利用docker部署到CentOs7下挂载日志文件的时候会匹配不上。在Window下 / 左 \右斜杆都能访问路径,之所以Window磁盘默认访问路径都是是\,因为dos命令的可选参数是用/左斜杆,Window为了区别,所以磁盘路径用\,但dos用的不多,后面两种斜杆都能支持访问文件。但在Linux下路径访问为/。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Serilog": {
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "logs/{Date}.txt",//!!!!
          "RestrictedToMinimumLevel": "Warning"
        }
      },
      {
        "Name": "Console"
      }
    ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "System": "Information"
      }
    }
  }
}

1.4 在WeatherForecastController打日志输出到txt

[HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogWarning("测试txt日志");
             var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }

2 、发布项目到Publishes文件夹

2.1 添加Dockerfile

在Publishes文件夹编写Dockerfile

#添加.nencore3.1基础镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#容器工作目录
WORKDIR /app

#指定项webapi或mvc站点的内部启动端口,默认是80
ENV ASPNETCORE_URLS http://0.0.0.0:50001

#暴露docker容器端口
#EXPOSE 50001
#EXPOSE 443


#拷贝发布目录下的所有文件到容器的工作根目录
#COPY . . (这样写也可以)
COPY ./ ./
# 如果用System.SqlClient.dll访问数据库,需要加这一句RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf
#容器入口点
ENTRYPOINT ["dotnet", "PublishAspNetCore3.1WithDocker.dll"]

3、打包Publishes文件夹到CentOs7

3.1 新建文件夹core3,解压发布包

unzip Publishers.zip

3.2 构建镜像

docker build -t core3 .

4、运行镜像

docker run -d --name core -p 8001:50001 -v $PWD/appdata/logs:/app/logs core3

命令参数:

-v :挂载到卷 前者磁盘绝对路径:后者相对路径(具体要看Dockerfile你设置的工作目录是什么,当前是/app)

路径/appdata/logs 需要提前创建,否则挂载失败

同时也可以挂载其他文件如appsetting.json,需求提前把文件拷贝本机目录。

$PWD:当前路径

4.1 查看容器挂载信息

docker inspect core

1598766522(1)

4.2 地址栏访问我们的api

1598766614(1)

4.3 查看挂载目录是否有日志生成

image-20200830140844605

挂载生成成功

推荐阅读