我想在我的网站上记录错误。日志类需要IHostingEnvironment来获取日志文件路径。 DI仅适用于构造函数,而静态类没有构造函数。
我删除了静态函数并添加了构造函数,但是现在当我启动Log类时,构造函数在询问IHostingEnvironment参数。最后,我需要使用IHostingEnvironment我的所有控制器来使用日志类吗?
.net Core调用Controller类,而没有来自浏览器的参数。我该如何处理我的日志类?
目前就是这样。
public class LogServices
{
public static void Log(string logMessage, IHostingEnvironment env)
{
string logName = env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
using (StreamWriter w = File.AppendText(logName))
{
w.Write("\r ");
w.WriteLine($" :{logMessage}");
}
}
}
但是我想要这样的东西:
public class LogServices
{
public static void Log(string logMessage,[FromServices] IHostingEnvironment env)
{
string logName = env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
using (StreamWriter w = File.AppendText(logName))
{
w.Write("\r ");
w.WriteLine($" :{logMessage}");
}
}
}
如果这行得通,我可以这样调用日志文件
LogServices.Log("Error bal balblaa");
但是显然它不起作用,因为LogServices.Log再次询问IHostingEnvironment参数。与第一个相似。
答案 0 :(得分:4)
不要使用静态类。将您的注入类注册为单例,并在构造函数中要求IHostingEnvironment
。
public class LogServices
{
private readonly IHostingEnvironment _env;
public LogServices(IHostingEnvironment env)
{
_env = env;
}
public void Log(string logMessage)
{
string logName = _env.WebRootPath + "\\Log\\Log_" + DateTime.Now.ToString("dd_MM_yyyy") + ".txt";
using (StreamWriter w = File.AppendText(logName))
{
w.Write("\r ");
w.WriteLine($" :{logMessage}");
}
}
}
然后在ConfigureServices
中的Startup.cs
方法中:
services.AddSingleton<LogServices>();
然后,在需要它的任何地方,都可以在构造函数中请求LogServices
,它将被注入。
但是您也可以考虑使其从ILogger
继承并使用内置的日志记录框架。您可以阅读有关here的信息。最大的好处是,每当您记录某些内容时,它都会写入每个注册的记录器中,而不仅仅是一个。因此,它仍然可以写入调试窗口以及您的自定义记录器,而无需任何额外的代码。
虽然涉及更多。有一个完整的示例,您可以创建自己的日志记录提供程序以写入文件here。