第一種 log4net.config配置信息
1.寫日誌方法,自己打個包 將log4net.config放在類庫里 屬性Copy to Output Directory設置 Copy always/ Copy if Newer,防止配置文件修改后不生效,導致不產生日誌文件
2.AssemblyInfo文件增加一行[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
log4net.config 配置如下
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="RollingLogErr" />
</logger>
<logger name="loginfo" additivity="false">
<level value="INFO" />
<appender-ref ref="RollingLoginfo" />
</logger>
<!--定義輸出到文件中-->
<appender name="RollingLogErr" type="log4net.Appender.RollingFileAppender">
<!--防止中文字亂碼-->
<param name="Encoding" value="utf-8" />
<!--定義文件存放位置-->
<file value="log\\"/>
<!--是否向文件中追加日誌-->
<appendToFile value="true"/>
<!--日志根據日期滾動-->
<rollingStyle value="Date"/>
<datePattern value="yyyyMM\\yyyyMMdd'.txt'"/>
<!--日誌文件名是否固定不變-->
<staticLogFileName value="false"/>
<!--日誌保留天數-->
<param name="MaxSizeRollBackups" value="30"/>
<layout type="log4net.Layout.PatternLayout">
<!--每條日誌末尾的文字說明-->
<!--輸出格式-->
<!--案例:2016-01-07 23:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%n時間:%date %n線程ID:[%thread] %n類別: %-5level %n對象:%logger %n描述:%message%newline %n"/>
</layout>
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--ERROR級別信息寫入log文件夾-->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="ERROR" />
</filter>
</appender>
<!--定義輸出到文件中-->
<appender name="RollingLoginfo" type="log4net.Appender.RollingFileAppender">
<!--防止中文字亂碼-->
<param name="Encoding" value="utf-8" />
<!--定義文件存放位置-->
<file value="info\\"/>
<!--是否向文件中追加日誌-->
<appendToFile value="true"/>
<!--日志根據日期滾動-->
<rollingStyle value="Date"/>
<datePattern value="yyyyMM\\yyyyMMdd'.txt'"/>
<!--日誌文件名是否固定不變-->
<staticLogFileName value="false"/>
<!--日誌保留天數-->
<param name="MaxSizeRollBackups" value="30"/>
<layout type="log4net.Layout.PatternLayout">
<!--每條日誌末尾的文字說明-->
<!--輸出格式-->
<!--案例:2016-01-07 23:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%n時間:%date %n線程ID:[%thread] %n類別: %-5level %n對象:%logger %n描述:%message%newline %n"/>
</layout>
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--INFO級別信息寫入INFO文件夾-->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="INFO" />
</filter>
</appender>
<root>
<!--1. ALL 2. DEBUG 3. INFO 4. WARN 5. ERROR 6. FATAL 7. OFF-->
<level value="ALL"/>
<!--文件形式記錄日誌 日誌會同時向以下引用寫入日誌,單獨寫入文件在appender節點增加過濾-->
<appender-ref ref="RollingLogErr"/>
<appender-ref ref="RollingLoginfo"/>
</root>
</log4net>
</configuration>
打包的方法
/// <summary>
/// 日誌處理 需要引用Log4net.config,og4net.dll
/// </summary>
public class LogHelper
{
private static ILog GetLog(string Source)
{
ILog loginfo;
try
{
//不做這個處理,第一次使用loginfo是在拋錯的地方才會生效
//否則第一次使用loginfo不是拋錯的地方,後續可能導致一直無法產生日誌
ICollection logFig = log4net.Config.XmlConfigurator.Configure();
}
catch {}
loginfo=log4net.LogManager.GetLogger(Source);
return loginfo;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="Msg">異常提示</param>
/// <param name="se">系統異常</param>
public static bool WriteLog(string Source, string Msg, Exception se)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsErrorEnabled)
{
loginfo.Error(Msg, se);
}
return loginfo.IsErrorEnabled;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="Err">系統異常</param>
/// <param name="msg">異常提示</param>
public static bool WriteLog(string Source, string Err, string msg)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsErrorEnabled)
{
loginfo.Error(msg + "\r\n" + Err);
}
return loginfo.IsErrorEnabled;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="se">異常提示</param>
public static bool WriteLog(string Source, Exception se)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsErrorEnabled)
{
loginfo.Error("Error", se);
}
return loginfo.IsErrorEnabled;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="Msg">異常提示</param>
public static bool WriteLog(string Source, string Msg)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsErrorEnabled)
{
loginfo.Error(Msg);
}
return loginfo.IsErrorEnabled;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="se">異常提示</param>
public static bool WriteInfo(string Source, Exception se)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsInfoEnabled)
{
loginfo.Info("Error", se);
}
return loginfo.IsInfoEnabled;
}
/// <summary>
/// Log4,寫日誌
/// </summary>
/// <param name="Source">日誌來源 --方法名稱</param>
/// <param name="Msg">異常提示</param>
public static bool WriteInfo(string Source, string Msg)
{
ILog loginfo = GetLog(Source);
if (loginfo.IsInfoEnabled)
{
loginfo.Info(Msg);
}
return loginfo.IsInfoEnabled;
}
}
第二種 Web.Config/App.config里的配置
配置如下 差不多就是將log4net.config里的信息拷過來,就是要注意下configSections節點下可能有其他別的信息
A 不記錄日誌異常備註:
1.log4net.config單獨配置的,注意文件Copy to Output Directory屬性,防止生成的Debug/Release文件下沒有此文件或者文件不對
2.log4net.config單獨配置的未設定AssemblyInfo信息
3.未做ICollection logFig = log4net.Config.XmlConfigurator.Configure();//參考上面代碼
//不做這個處理,第一次使用loginfo是在拋錯的地方才會生效
//否則第一次使用loginfo不是拋錯的地方,後續可能導致一直無法產生日誌
4.產生了日誌文件夾,為產生日誌信息的,檢查配置信息的root節點的<appender-ref ref="RollingLogErr"/>和<appender name="RollingLoginfo"..節點的屬性名稱是否存在差異
B 將不同級別的信息寫在不同的文件里
配置信息 root節點和appender節點搭配使用,詳情參考上面log4net.config的配置代碼
C.防止多進程日誌文件佔用,導致日誌文件嵌套 設置 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />, 見參考上面log4net.config的配置代碼