Car*_*nke 9 c# logging serilog
我正在尝试使用我的ASP.NET Core应用程序设置Serilog.我想为所有控制器提供一个日志文件,一个用于所有服务,一个用于其余服务,理想情况下包含一切.每个控制器都是继承BaseController
和每个服务BaseService
.我正在调用的控制器和服务正在编写跟踪日志事件.
通过依赖注入检索记录器和服务.该服务看起来像控制器(关于记录器).
public class UsersController: BaseController
{
private UserService service { get; }
public UsersController(ILogger<UsersController> logger, UserService userService) : base(logger)
{
service = userService;
}
}
public abstract class BaseController: Controller
{
protected readonly ILogger<BaseController> Logger;
public BaseController(ILogger<BaseController> logger)
{
Logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
方法1(仅与基础部门合作)
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(l => l
.MinimumLevel.Verbose()
.WriteTo.Logger(l2 => l2
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<BaseController>())
.Filter.ByExcluding(Matching.FromSource<BaseService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
)
.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
这将仅为"其他"和"全部"创建日志文件.两者都包含来自控制器和服务的日志事件.
方法2(使用具体类)
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(l => l
.MinimumLevel.Verbose()
.WriteTo.Logger(l2 => l2
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseController>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeGroupsController>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegesController>())
.Filter.ByIncludingOnly(Matching.FromSource<UsersController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<BaseService>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeGroupService>())
.Filter.ByIncludingOnly(Matching.FromSource<PrivilegeService>())
.Filter.ByIncludingOnly(Matching.FromSource<UserService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<BaseController>())
.Filter.ByExcluding(Matching.FromSource<UsersController>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeGroupsController>())
.Filter.ByExcluding(Matching.FromSource<PrivilegesController>())
.Filter.ByExcluding(Matching.FromSource<BaseService>())
.Filter.ByExcluding(Matching.FromSource<UserService>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeGroupService>())
.Filter.ByExcluding(Matching.FromSource<PrivilegeService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
)
.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
这将仅为"其他"和"全部"创建日志文件."all"包含来自控制器和服务的日志事件.
方法3(仅与用户类一起使用)
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(l => l
.MinimumLevel.Verbose()
.WriteTo.Logger(l2 => l2
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<UsersController>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByIncludingOnly(Matching.FromSource<UserService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l3 => l3
.Filter.ByExcluding(Matching.FromSource<UsersController>())
.Filter.ByExcluding(Matching.FromSource<UserService>())
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
)
.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
这将创建所有日志文件,每个文件都包含预期的消息.
为实现预期目标需要做些什么(见本文第二句).
最好的问候,Carsten
Nic*_*rdt 11
Serilog也将通过命名空间过滤来描述:
var isController = Matching.FromSource("MyApp.Controllers");
var isService = Matching.FromSource("MyApp.Services");
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.RollingFile("d:/logs/recon-api-all-{Date}.log")
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(isController)
.WriteTo.RollingFile("d:/logs/recon-api-controller-{Date}.log"))
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(isService)
.WriteTo.RollingFile("d:/logs/recon-api-service-{Date}.log"))
.WriteTo.Logger(l => l
.Filter.ByExcluding(e => isController(e) || iService(e))
.WriteTo.RollingFile("d:/logs/recon-api-other-{Date}.log"))
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
如果命名空间无法识别控制器和服务,则可以编写lambda函数来代替isController
或isService
标识它们.
(您的场景可能更适合于允许更容易过滤的日志记录格式,因此您可以通过事后过滤来有选择地查看控制器事件,服务事件等等.请查看其他Serilog 为某些选项提供的接收器.)
归档时间: |
|
查看次数: |
7125 次 |
最近记录: |