我使用.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;
}
}
}
答案 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; }
}