VS创建Log4Net类库,实现日志记录,方便调用
一、VS2017创建类库
在类库中首先引入Log4net.dll,之后创建Log4Net.config配置文件[网上有很多]、在Properties的AssemblyInfo.cs添加如图,最后创建一个logger辅助类。
1.log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!--********************************************************************************************************************************-->
<!-- Debug 将日志以回滚文件的形式写到文件中 -->
<appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender" >
<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
<file value="App_Data\\" />
<!-- 日志文件的命名规则 -->
<datePattern value="yyyy-MM-dd/'Debug.log'"/>
<!-- 将日志信息追加到已有的日志文件中-->
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="1MB" />
<!-- 指定按日期切分日志文件 -->
<rollingStyle value="Date"/>
<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
<staticLogFileName value="false" />
<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n====================
%n【日志时间】: %d
%n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger
%n【日志内容】:%m %newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Debug" />
<param name="LevelMax" value="Debug" />
</filter>
</appender>
<!-- Info 将日志以回滚文件的形式写到文件中 -->
<appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender" >
<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
<file value="App_Data\\" />
<!-- 日志文件的命名规则 -->
<datePattern value="yyyy-MM-dd/'Info.log'"/>
<!-- 将日志信息追加到已有的日志文件中-->
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="1MB" />
<!-- 指定按日期切分日志文件 -->
<rollingStyle value="Date"/>
<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
<staticLogFileName value="false" />
<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n====================
%n【日志时间】: %d
%n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger
%n【日志内容】:%m %newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Info" />
</filter>
</appender>
<!-- %n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger -->
<!--********************************************************************************************************************************-->
<!-- WARN 将日志以回滚文件的形式写到文件中 -->
<appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender" >
<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
<file value="App_Data\\" />
<!-- 日志文件的命名规则 -->
<datePattern value="yyyy-MM-dd/'Warn.log'"/>
<!-- 将日志信息追加到已有的日志文件中-->
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="1MB" />
<!-- 指定按日期切分日志文件 -->
<rollingStyle value="Date"/>
<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
<staticLogFileName value="false" />
<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n====================
%n【日志时间】: %d
%n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger
%n【日志内容】:%m %newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Warn" />
<param name="LevelMax" value="Warn" />
</filter>
</appender>
<!--********************************************************************************************************************************-->
<!-- Error 将日志以回滚文件的形式写到文件中 -->
<appender name="RollingFileError" type="log4net.Appender.RollingFileAppender" >
<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
<file value="App_Data\\" />
<!-- 日志文件的命名规则 -->
<datePattern value="yyyy-MM-dd/'Error.log'"/>
<!-- 将日志信息追加到已有的日志文件中-->
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="1MB" />
<!-- 指定按日期切分日志文件 -->
<rollingStyle value="Date"/>
<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
<staticLogFileName value="false" />
<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n====================
%n【日志时间】: %d
%n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger
%n【日志内容】:%m %newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
</appender>
<!--********************************************************************************************************************************-->
<!-- Fatal 将日志以回滚文件的形式写到文件中 -->
<appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender" >
<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
<file value="App_Data\\" />
<!-- 日志文件的命名规则 -->
<datePattern value="yyyy-MM-dd/'Fatal.log'"/>
<!-- 将日志信息追加到已有的日志文件中-->
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="1MB" />
<!-- 指定按日期切分日志文件 -->
<rollingStyle value="Date"/>
<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
<staticLogFileName value="false" />
<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n====================
%n【日志时间】: %d
%n【线 程 ID】: [%thread]
%n【日志级别】: %-5p
%n【出错文件】:%F
%n【出错行号】:%L
%n【出错的类】:%logger
%n【日志内容】:%m %newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Fatal" />
<param name="LevelMax" value="Fatal" />
</filter>
</appender>
<!--********************************************************************************************************************************-->
<root>
<!--控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
如果没有定义LEVEL的值,则缺省为DEBUG-->
<appender-ref ref="RollingFileDebug" />
<appender-ref ref="RollingFileInfo" />
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
<appender-ref ref="RollingFileFatal" />
<level value="DEBUG" />
</root>
<logger name="NHibernate">
<level value="WARN" />
</logger>
</log4net>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
</configuration>
2.Logger.cs日志辅助类
namespace XXXXXXXX
{
/// <summary>
///日志辅助类
/// </summary>
public sealed class Logger
{
#region [ 单例模式 ]
private static readonly Logger _logger = new Logger();
private static readonly log4net.ILog _Logger4net = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// 无参私有构造函数
/// </summary>
/// public Logger(){}
private Logger(){}
/// <summary>
/// 得到单例
/// </summary>
public static Logger Singleton
{
get
{
return _logger;
}
}
#endregion
#region [ 参数 ]
public bool IsDebugEnabled
{
get { return _Logger4net.IsDebugEnabled; }
}
public bool IsInfoEnabled
{
get { return _Logger4net.IsInfoEnabled; }
}
public bool IsWarnEnabled
{
get { return _Logger4net.IsWarnEnabled; }
}
public bool IsErrorEnabled
{
get { return _Logger4net.IsErrorEnabled; }
}
public bool IsFatalEnabled
{
get { return _Logger4net.IsFatalEnabled; }
}
#endregion
#region [ 接口方法 ]
#region [ Debug ]
public void Debug(string message)
{
if (this.IsDebugEnabled)
{
this.Log(LogLevel.Debug, message);
}
}
public void Debug(string message, Exception exception)
{
if (this.IsDebugEnabled)
{
this.Log(LogLevel.Debug, message, exception);
}
}
public void DebugFormat(string format, params object[] args)
{
if (this.IsDebugEnabled)
{
this.Log(LogLevel.Debug, format, args);
}
}
public void DebugFormat(string format, Exception exception, params object[] args)
{
if (this.IsDebugEnabled)
{
this.Log(LogLevel.Debug, string.Format(format, args), exception);
}
}
#endregion
#region [ Info ]
public void Info(string message)
{
if (this.IsInfoEnabled)
{
this.Log(LogLevel.Info, message);
}
}
public void Info(string message, Exception exception)
{
if (this.IsInfoEnabled)
{
this.Log(LogLevel.Info, message, exception);
}
}
public void InfoFormat(string format, params object[] args)
{
if (this.IsInfoEnabled)
{
this.Log(LogLevel.Info, format, args);
}
}
public void InfoFormat(string format, Exception exception, params object[] args)
{
if (this.IsInfoEnabled)
{
this.Log(LogLevel.Info, string.Format(format, args), exception);
}
}
#endregion
#region [ Warn ]
public void Warn(string message)
{
if (this.IsWarnEnabled)
{
this.Log(LogLevel.Warn, message);
}
}
public void Warn(string message, Exception exception)
{
if (this.IsWarnEnabled)
{
this.Log(LogLevel.Warn, message, exception);
}
}
public void WarnFormat(string format, params object[] args)
{
if (this.IsWarnEnabled)
{
this.Log(LogLevel.Warn, format, args);
}
}
public void WarnFormat(string format, Exception exception, params object[] args)
{
if (this.IsWarnEnabled)
{
this.Log(LogLevel.Warn, string.Format(format, args), exception);
}
}
#endregion
#region [ Error ]
public void Error(string message)
{
if (this.IsErrorEnabled)
{
this.Log(LogLevel.Error, message);
}
}
public void Error(string message, Exception exception)
{
if (this.IsErrorEnabled)
{
this.Log(LogLevel.Error, message, exception);
}
}
public void ErrorFormat(string format, params object[] args)
{
if (this.IsErrorEnabled)
{
this.Log(LogLevel.Error, format, args);
}
}
public void ErrorFormat(string format, Exception exception, params object[] args)
{
if (this.IsErrorEnabled)
{
this.Log(LogLevel.Error, string.Format(format, args), exception);
}
}
#endregion
#region [ Fatal ]
public void Fatal(string message)
{
if (this.IsFatalEnabled)
{
this.Log(LogLevel.Fatal, message);
}
}
public void Fatal(string message, Exception exception)
{
if (this.IsFatalEnabled)
{
this.Log(LogLevel.Fatal, message, exception);
}
}
public void FatalFormat(string format, params object[] args)
{
if (this.IsFatalEnabled)
{
this.Log(LogLevel.Fatal, format, args);
}
}
public void FatalFormat(string format, Exception exception, params object[] args)
{
if (this.IsFatalEnabled)
{
this.Log(LogLevel.Fatal, string.Format(format, args), exception);
}
}
#endregion
#endregion
#region [ 内部方法 ]
/// <summary>
/// 输出普通日志
/// </summary>
/// <param name="level"></param>
/// <param name="format"></param>
/// <param name="args"></param>
private void Log(LogLevel level, string format, params object[] args)
{
switch (level)
{
case LogLevel.Debug:
_Logger4net.DebugFormat(format, args);
break;
case LogLevel.Info:
_Logger4net.InfoFormat(format, args);
break;
case LogLevel.Warn:
_Logger4net.WarnFormat(format, args);
break;
case LogLevel.Error:
_Logger4net.ErrorFormat(format, args);
break;
case LogLevel.Fatal:
_Logger4net.FatalFormat(format, args);
break;
}
}
/// <summary>
/// 格式化输出异常信息
/// </summary>
/// <param name="level"></param>
/// <param name="message"></param>
/// <param name="exception"></param>
private void Log(LogLevel level, string message, Exception exception)
{
switch (level)
{
case LogLevel.Debug:
_Logger4net.Debug(message, exception);
break;
case LogLevel.Info:
_Logger4net.Info(message, exception);
break;
case LogLevel.Warn:
_Logger4net.Warn(message, exception);
break;
case LogLevel.Error:
_Logger4net.Error(message, exception);
break;
case LogLevel.Fatal:
_Logger4net.Fatal(message, exception);
break;
}
}
#endregion
}//end of class
#region [ enum: LogLevel ]
/// <summary>
/// 日志级别
/// </summary>
public enum LogLevel
{
Debug,
Info,
Warn,
Error,
Fatal
}
#endregion
}
最后大功告成!
—HaoGeGe