我发现了serilog(.net的结构化日志),并发现了很多优点.但是我遇到了一些问题.
我有4个项目,一个是web,一个是基础设施,另外两个是 windows服务,我想声明一次serilog配置并多次使用它.
而且我也希望将它与依赖注入一起使用.
我已经在网上搜索了三天了,但我没有找到任何有用的东西,请一些人帮助我.
我有4个项目,一个是web,一个是基础设施,另外两个是 windows服务,我想声明一次serilog配置并多次使用它.
而且我也希望将它与依赖注入一起使用.
我已经在网上搜索了三天了,但我没有找到任何有用的东西,请一些人帮助我.
例如,我希望这个类成为我的日志类.
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; }));
在我的实现中,我不是抽象Serilog,但上面的代码在任何情况下都是缺失的链接. IMyLogger只需要参数注入ILogger,一切都会自行解决.
这解决了MVC部分:您可以将IMyLogger注入MVC中的控制器.
这将我们带到您的解决方案中的位置.由于您对服务的需求,您可能需要一个包含绑定的单独的Inversion of Control项目(MySolution.InversionOfControl).然后,例如在您的网站的UnityWebActivator.cs中,您可以执行以下操作:
/// <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)); }
为您的服务做同样的事情,你应该好好去!