第十章:日志系统与项目部署

博客v1.0系列教程(Csharp)博客 v1.0 系列教程 (C#)

10.1 Serilog 日志配置

// Program.cs
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("logs/blog-.log",
        rollingInterval: RollingInterval.Day,
        retainedFileCountLimit: 30)
    .CreateLogger();

builder.Host.UseSerilog();

10.2 审计日志

public class LogService : ILogService
{
    private readonly IRepository<LogModel> _logRepo;

    public async Task RecordLogAsync(LogDto dto)
    {
        var log = new LogModel
        {
            Type = dto.Type,       // login/operation/error
            Level = dto.Level,     // info/warning/error
            Message = dto.Message,
            Ip = dto.Ip,
            UserId = dto.UserId,
            CreateTime = DateTime.UtcNow
        };
        await _logRepo.InsertAsync(log);
    }

    public async Task<PageResult<LogModel>> GetLogsAsync(
        int page, int pageSize, string? type, string? level)
    {
        var query = _logRepo.AsQueryable()
            .WhereIF(!string.IsNullOrEmpty(type), l => l.Type == type)
            .WhereIF(!string.IsNullOrEmpty(level), l => l.Level == level)
            .OrderBy(l => l.CreateTime, OrderByType.Descending);

        var total = await query.CountAsync();
        var items = await query.Skip((page - 1) * pageSize)
            .Take(pageSize).ToListAsync();

        return new PageResult<LogModel>(items, total, page, pageSize);
    }
}

10.3 Docker Compose 配置

version: '3.8'

services:
  postgres:
    image: postgres:17-alpine
    environment:
      POSTGRES_DB: blog
      POSTGRES_USER: blog
      POSTGRES_PASSWORD: blog123
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  elasticsearch:     # 可选
    image: elasticsearch:8.12.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"

volumes:
  pgdata:

10.4 一键部署脚本 (deploy.ps1)

# 1. 构建前端
cd Blog.Vue
npm run build

# 2. 发布后端
cd ../Blog.Api
dotnet publish -c Release -o ../publish

10.5 Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "Blog.Api.dll"]

至此,博客 v1.0 (C#) 系列教程完成!我们从项目架构设计开始,逐步实现了完整的博客系统。

csharploggingserilogdockerdeploy