假设我有一个可能被我的应用程序中的每个类使用的实用程序(例如记录器)。我希望记录器能够保存有关使用记录器的客户端类型的信息,即如果StockProvider
想要记录消息,记录器应该附加StockProvider
类名和日志消息。并且StockProvider
通过构造函数传递记录器,如
public StockProvider (ILogger logger) {}
所以它可以在其方法中使用记录器。
我知道每次使用记录器时都会传递类型信息,例如logger.Log (GetType(), msg)
。我想要的是记录器在其状态下具有该客户端类型信息,而不是必须将该类型信息传递给记录器方法,以便调用Log
导致消息被附加类型名称。例如。使用像
class Logger : ILogger {
public Logger (Type clientType) {
this.type = clientType;
}
public void Log(string msg)
{ Console.WriteLine(this.type.FullName + msg); }
}
将在StockProvider
内部工作,我可以说
logger.Log (msg)
所以问题是:我能够以这样一种通用的方式注册Logger
,它接收请求记录器的clientType
客户端是StockProvider
还是其他任何其他客户类型?
请注意,我使用记录器只是一些可能在代码中广泛使用的类的示例。它也可能是一种想要知道谁触发事件的事件发布者
答案 0 :(得分:2)
您可以创建一个通用记录器,如:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/line">
</View>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/line">
</View>
</LinearLayout>
现在您必须在DI容器中注册 public interface ILogger<T> where T: class
{
void Log(string message, LogLevel level);
}
public class Logger<T> : ILogger<T>
where T: class
{
public void Log(string message, LogLevel level)
{
WriteLog(typeof(T).Name + ": " + message, level);
}
}
的通用实现,例如在ILogger
中您可以执行此操作:
UnityContainer
接下来,您的提供商必须如下:
IUnituContainer container = new UnityContainer()'
container.RegisterType(typeof(ILogger<>), typeof(Logger<>));
答案 1 :(得分:0)
使用log4Net,你可以这样做:
public class Import
{
private static ILog Log
{
get
{
if (LogManager.GetCurrentLoggers().Length == 0)
{
// load logger config with XmlConfigurator
log4net.Config.XmlConfigurator.Configure();
}
return LogManager.GetLogger(typeof(Import));
}
}
在我的案例中,Import是我班级的名称,因为很明显。您需要根据需要更改此代码。