在SeriLog ASP.NET中显示用户电子邮件

时间:2018-01-12 22:50:02

标签: c# asp.net .net visual-studio serilog

我使用.Net Cli将数据记录到SeriLog中。显示用户的电子邮件时出现问题。这是我得到的:System.Collections.Generic.List`1 [Net3.Models.AccountViewModels.UserListingVM],虽然我想获取:someonesname@email.com。我不知道为什么我没有得到我想要的结果,但这里是以下来自Controller和Repository的代码: 附:我很擅长这个。提前谢谢。

***** UserController.cs *****

           using System;
           using System.Collections.Generic;
           using System.Linq;
           using System.Threading.Tasks;
           using Microsoft.AspNetCore.Http;
           using Microsoft.AspNetCore.Mvc;
           using Net3.Data;
           using Net3.Repository;
           using Microsoft.AspNetCore.Authorization;
           using Serilog;
           using Net3.Models.AccountViewModels;

           namespace Net3.Controllers
 {
    [Authorize]
    public class UserController : Controller
{
        ApplicationDbContext _context;

        public UserController(ApplicationDbContext context)
        {
            _context = context;
        }

    public ActionResult Index()
    {
        UserRepository userRepository = new UserRepository(_context);

        UserListingVM usersListing = new UserListingVM();

         var userInfo = _context.Users.Select(u => new UserListingVM()
        {
            Id = u.Id,
            Email = u.Email
        });

         Log.Debug(userInfo.ToList().ToString());

        return View(userRepository.GetAll());
    }
}

}

***UserRepository***

 using Net3.Data;
 using Net3.Models.AccountViewModels;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;

 namespace Net3.Repository
 {
    public class UserRepository
  {
    ApplicationDbContext _context;

    public UserRepository(ApplicationDbContext context)
    {
        this._context = context;
    }


    public IEnumerable<UserListingVM> GetAll()
    {
        var usersListing = _context.Users.Select(u => new UserListingVM()
        {
            Id = u.Id,
            Email = u.Email
        });
        return usersListing;
    }
}
}

1 个答案:

答案 0 :(得分:1)

这是使用Serilog的错误方法。您的消息模板字符串应该是常量。它不应该改变。有关详细信息,请阅读the documentation

您应该做的是将用户转换为列表(因为我们不想从数据库中多次提取它)。然后使用常量格式字符串并将电子邮件列表作为参数传递。请勿按照评论中的建议使用string.Join。 Serilog用于记录structured data,你应该利用它。这意味着你可以记录一个字符串数组(或任何其他类型的对象!),并且在大多数情况下让Serilog正确处理它。

List<UserListingVM> userInfo = _context.Users.Select(u => new UserListingVM()
    {
        Id = u.Id,
        Email = u.Email
    }).ToList();

 List<string> userEmails = userInfo.Select(u => u.Email).ToList();

Log.Debug("Displaying Users {@Users}", userEmails);

使用Serilog.Sinks.Console接收器,我得到了一些测试用户的输出:

[22:01:24 DBG] Displaying Users ["test@gmail.com", "johndoe@gmail.com", "larryjoe@gmail.com"]

这是一个你可以做的控制台应用程序,它显示了这个完全正常工作:

using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .CreateLogger();

        var users = new List<UserListingVM>
            {
                new UserListingVM
                {
                    Id = 1,
                    Email = "test@gmail.com"
                },
                new UserListingVM
                {
                    Id = 2,
                    Email = "johndoe@gmail.com"
                },
                new UserListingVM
                {
                    Id = 3,
                    Email = "larryjoe@gmail.com"
                },
            };

        var userEmails = users.Select(u => u.Email).ToList();
        Log.Debug("Displaying Users {@Users}", userEmails);
        Console.WriteLine("press any key to exit");
        Console.ReadKey();
    }
}

class UserListingVM
{
    public int Id { get; set; }
    public string Email { get; set; }
}