C# 如何与Unity一起使用Serilog?
最近我发现了serilog(针对.net的结构化日志记录),并看到了它的许多优点。但我面临着一些问题。 我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明serilog配置一次并多次使用它。 我还想将它与依赖项注入一起使用。 我已经在网上搜索了三天了,但我没有发现任何有用的东西,请有人帮我 例如,我希望这个类成为我的日志类C# 如何与Unity一起使用Serilog?,c#,asp.net-mvc,dependency-injection,unity-container,serilog,C#,Asp.net Mvc,Dependency Injection,Unity Container,Serilog,最近我发现了serilog(针对.net的结构化日志记录),并看到了它的许多优点。但我面临着一些问题。 我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明serilog配置一次并多次使用它。 我还想将它与依赖项注入一起使用。 我已经在网上搜索了三天了,但我没有发现任何有用的东西,请有人帮我 例如,我希望这个类成为我的日志类 public interface IMyLogger { void Information(string message, objec
public interface IMyLogger
{
void Information(string message, object[] parameters);
}
public class MyLogger : IMyLogger
{
public MyLogger()
{
}
public void Information(string message, object[] parameters)
{
Log.Information("LogType : {LogType} - Operation : {Operation}", parameters);
}
}
public class UserClass
{
private readonly IMyLogger _myLogger;
public UserClass(IMyLogger myLogger)
{
_myLogger = myLogger;
}
}
现在我不知道应该把这行代码放在哪里:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
Tnx。首先,在Unity配置中,要正确解析Serilog,需要使用InjectionFactory,如下所示:
container.RegisterType<ILogger>(new ContainerControlledLifetimeManager(), new InjectionFactory((ctr, type, name) =>
{
ILogger log = new LoggerConfiguration()
.WriteTo.Console() //Your serilog config here
.CreateLogger();
return log;
}));
/// <summary>Integrates Unity when the application starts.</summary>
public static void Start()
{
//This is the important part:
var container = UnityConfig.GetConfiguredContainer(); //This is a static class in the InversionOfControl project.
//This is generic:
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
container.RegisterType(新ContainerControlledLifetimeManager(),新注入工厂((ctr,类型,名称)=>
{
ILogger日志=新日志配置()
.WriteTo.Console()//此处是您的serilog配置
.CreateLogger();
返回日志;
}));
在我的实现中,我没有抽象Serilog,但是上面的代码在任何情况下都是缺少的链接。IMyLogger只需要参数注入ILogger,一切都会自行解决
这就解决了MVC部分:您可以在MVC中向控制器中注入IMyLogger
这就让我们知道在您的解决方案中应该在哪里找到它。由于您对服务的需求,您可能需要一个单独的包含绑定的反转控制项目(MySolution.InversionOfControl)。然后,例如,在网站的UnityWebActivator.cs中,可以执行以下操作:
container.RegisterType<ILogger>(new ContainerControlledLifetimeManager(), new InjectionFactory((ctr, type, name) =>
{
ILogger log = new LoggerConfiguration()
.WriteTo.Console() //Your serilog config here
.CreateLogger();
return log;
}));
/// <summary>Integrates Unity when the application starts.</summary>
public static void Start()
{
//This is the important part:
var container = UnityConfig.GetConfiguredContainer(); //This is a static class in the InversionOfControl project.
//This is generic:
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
///在应用程序启动时集成Unity。
公共静态void Start()
{
//这是重要的部分:
var container=UnityConfig.GetConfiguredContainer();//这是InversionOfControl项目中的一个静态类。
//这是通用的:
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType().First());
FilterProviders.Providers.Add(新UnityFilterAttributeFilterProvider(容器));
SetResolver(新UnitedDependencyResolver(容器));
}
为您的服务做同样的事情,您应该很乐意去做 这很有效。但是我注意到,Unity 4.0.1中没有指定的默认生存期管理器是瞬态生存期管理器。这意味着每个解析ILogger的调用都将执行注入工厂并返回一个新实例。我认为日志记录器应该使用ContainerController LifeTimeManager来代替?@dotnetguy迟做总比不做好,我现在正在更新它。:)对于其他所有人来说:ContainerController LifeTimeManager在模仿Serilog的单例行为方面做得最好。其他生命周期管理器也可以工作,但这可能比为每个请求创建一个新的Serilog实例略为有效。ContainerControlled生命周期管理器和HierarchyCallifeTimeManager是唯一调用dispose方法的。因此,使用任何其他工具都可能会影响日志的刷新。像@BrianMacKay一样,我也认为容器控制对SeriLog更好。如何通过工厂配置记录器(如最低级别)?这里有一个奇怪的第22条军规。我使用命令行参数来确定是否启用了调试日志记录。但是,处理命令行参数是在设置组合根之后进行的。但是我需要这个输入参数来配置
LoggerConfiguration
以使用最低级别的调试或信息