为整个项目配置 Log4Net
Configure Log4Net for the full project
我有以下代码,可以很好地记录所有内容。我是否必须将其添加到我所有 类 的构造函数中?
有没有办法为整个项目配置它?我想我可以将日志传递给所有 类 但这接缝就像一个混乱的解决方案。
class Program
{
/// <summary>
/// Application start
/// <param name="settings"></param>
/// <returns></returns>
static int Main(string[] args)
{
string logFile = string.Format(@"{0}\Cloud\Cloud.Log", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
log4net.GlobalContext.Properties["LogFileName"] = logFile;
log4net.Config.XmlConfigurator.Configure();
ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Info("Console Applicatin Start");
}
}
我应该如何为完整的解决方案配置 Log4Net?
我认为这与问题无关,但这是我的 App.config:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="250KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
我通常使用包装器 class。类似于:
public class Logger
{
private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Logger));
static Logger()
{
log4net.Config.XmlConfigurator.Configure();
}
public void Error(string format, params object[] args)
{
_log.Error(string.Format(format, args));
}
//...
}
然后在我需要的地方实例化它。喜欢:
private Logger _log = new Logger();
并且像这样使用它:
_log.Error("Something went wrong, Exception: {0}, More parameters: {1}",
e.Message, "Another parameter");
log4net.Config.XmlConfigurator.Configure();
应该根据你的app.config配置log4net。
编辑:
我想我会 post 我的 log4net 配置,以防你想尝试一个已经确认有效的配置。它设置了一个文件记录器和一个控制台记录器(对于查看开发环境中的日志记录很有用):
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="DebugFileLogger" />
</root>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger: %message%newline" />
</layout>
</appender>
<appender name="DebugFileLogger" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs/DebugLog.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="20MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d%t %m%n" />
</layout>
</appender>
</log4net>
我最常看到的解决方案是创建一个 LogManager
class,并在每个 class 中创建一个 属性 来获取记录器的实例,所以这是每个 class 中获取记录器所需的唯一代码行:
private ILog _log;
public ILog Log
{
get { return _log ?? (_log = LogManager.GetLogger(LogName.WebServices)); }
}
LogName.WebServices
是一个枚举值,应该用更多的值扩展,这样您就可以进一步过滤日志。
log4net 的一个重要特性是能够根据记录器名称配置不同的过滤和处理:任何将记录器包装在包装器、单例或静态对象中的解决方案都会丢失它,因为所有日志都将使用相同的记录器名称 - 以及立即查看 class 日志条目来源的有用功能。
在要记录的 class 中,您只需要一个字段,例如:
private static ILog Log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
它将记录器名称设置为其包含的类型的名称。
我有以下代码,可以很好地记录所有内容。我是否必须将其添加到我所有 类 的构造函数中?
有没有办法为整个项目配置它?我想我可以将日志传递给所有 类 但这接缝就像一个混乱的解决方案。
class Program
{
/// <summary>
/// Application start
/// <param name="settings"></param>
/// <returns></returns>
static int Main(string[] args)
{
string logFile = string.Format(@"{0}\Cloud\Cloud.Log", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
log4net.GlobalContext.Properties["LogFileName"] = logFile;
log4net.Config.XmlConfigurator.Configure();
ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Info("Console Applicatin Start");
}
}
我应该如何为完整的解决方案配置 Log4Net?
我认为这与问题无关,但这是我的 App.config:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="250KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
我通常使用包装器 class。类似于:
public class Logger
{
private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Logger));
static Logger()
{
log4net.Config.XmlConfigurator.Configure();
}
public void Error(string format, params object[] args)
{
_log.Error(string.Format(format, args));
}
//...
}
然后在我需要的地方实例化它。喜欢:
private Logger _log = new Logger();
并且像这样使用它:
_log.Error("Something went wrong, Exception: {0}, More parameters: {1}",
e.Message, "Another parameter");
log4net.Config.XmlConfigurator.Configure();
应该根据你的app.config配置log4net。
编辑:
我想我会 post 我的 log4net 配置,以防你想尝试一个已经确认有效的配置。它设置了一个文件记录器和一个控制台记录器(对于查看开发环境中的日志记录很有用):
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="DebugFileLogger" />
</root>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger: %message%newline" />
</layout>
</appender>
<appender name="DebugFileLogger" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs/DebugLog.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="20MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d%t %m%n" />
</layout>
</appender>
</log4net>
我最常看到的解决方案是创建一个 LogManager
class,并在每个 class 中创建一个 属性 来获取记录器的实例,所以这是每个 class 中获取记录器所需的唯一代码行:
private ILog _log;
public ILog Log
{
get { return _log ?? (_log = LogManager.GetLogger(LogName.WebServices)); }
}
LogName.WebServices
是一个枚举值,应该用更多的值扩展,这样您就可以进一步过滤日志。
log4net 的一个重要特性是能够根据记录器名称配置不同的过滤和处理:任何将记录器包装在包装器、单例或静态对象中的解决方案都会丢失它,因为所有日志都将使用相同的记录器名称 - 以及立即查看 class 日志条目来源的有用功能。
在要记录的 class 中,您只需要一个字段,例如:
private static ILog Log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
它将记录器名称设置为其包含的类型的名称。