一、NuGet上安装log4net
二、添加log4net.config文件
在configuration中添加如下配置:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
<!--<appender-ref ref="EventLogAppender" />-->
<appender-ref ref="ErrorLogAppender" />
<appender-ref ref="DebugLogAppender" />
<appender-ref ref="WarnLogAppender" />
<appender-ref ref="InfoLogAppender" />
</root>
<!--定义输出到文件-->
<appender name ="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<param name="File" value ="Logs\"/>
<param name="AppendToFile" value="true" />
<param name="Encoding" value="utf-8" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<!--文件名格式-->
<param name="DatePattern" value="yyyy-MM-dd'.txt'" />
<param name="RollingStyle" value ="Date"/>
<!--不以独占方式记录日志,仅在记录每个日志的最短时间内锁定,因为部署到服务器上遇到了文件被占用无法下载日志-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!--定义输出格式-->
<!--示例 2018-08-20 12:10:49,348 -线程ID:[21][INFO]:[日志信息]-->
<param name="ConversionPattern" value="%date 线程ID:[%thread][%-5level]:%message[%class:%L]%newline"/>
</layout>
<!--过滤级别 FATAL > ERROR > WARN > INFO > DEBUG-->
<filter type="log4net.Filter.LevelRangeFilter">
<!--<param name="LevelMin" value="DEBUG" />-->
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<!--定义输出到 windows 事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message %newline"></conversionPattern>
</layout>
</appender>
<appender name="ErrorLogAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value ="Logs\"/>
<param name="AppendToFile" value="true"/>
<param name="Encoding" value="utf-8" />
<param name="MaxSizeRollBackups" value="100"/>
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd"_Error.txt"" />
<param name="RollingStyle" value="Date"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- <conversionPattern value="[%date{HH:mm:ss fff}] %-5level - %message%newline" /> -->
<param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:[%-5level] : [%message]%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<appender name="WarnLogAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value ="Logs\"/>
<param name="AppendToFile" value="true"/>
<param name="Encoding" value="utf-8" />
<param name="MaxSizeRollBackups" value="100"/>
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd"_Warn.txt"" />
<param name="RollingStyle" value="Date"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- <conversionPattern value="[%date{HH:mm:ss fff}] %-5level - %message%newline" /> -->
<param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:[%-5level] : [%message]%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="InfoLogAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value ="Logs\"/>
<param name="AppendToFile" value="true"/>
<param name="Encoding" value="utf-8" />
<param name="MaxSizeRollBackups" value="100"/>
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd"_Info.txt"" />
<param name="RollingStyle" value="Date"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- <conversionPattern value="[%date{HH:mm:ss fff}] %-5level - %message%newline" /> -->
<param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:[%-5level] : [%message]%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<appender name="DebugLogAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value ="Logs\"/>
<param name="AppendToFile" value="true"/>
<param name="Encoding" value="utf-8" />
<param name="MaxSizeRollBackups" value="100"/>
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyy-MM-dd"_Debug.txt"" />
<param name="RollingStyle" value="Date"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- <conversionPattern value="[%date{HH:mm:ss fff}] %-5level - %message%newline" /> -->
<param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:[%-5level] : [%message]%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
</log4net>
三、配置AssemblyInfo.cs
AssemblyInfo.cs中添加:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
四、封装Logger类:
public class Logger
{
//public static readonly ILog log = LogManager.GetLogger(typeof(Logger));
private static readonly ILog _log = LogManager.GetLogger(typeof(Logger));
public static void Error(string msg) => _log.Error(AppendClassLine(msg));
public static void Error(Exception ex, string msg = null) => _log.Error(msg, ex);
public static void Info(string msg) => _log.Info(AppendClassLine(msg));
public static void Info(Exception ex, string msg = null) => _log.Info(msg, ex);
public static void Debug(string msg) => _log.Debug(AppendClassLine(msg));
public static void Debug(Exception ex, string msg = null) => _log.Debug(msg, ex);
public static void Warn(string msg) => _log.Warn(AppendClassLine(msg));
public static void Warn(Exception ex, string msg = null) => _log.Warn(msg, ex);
public static void Fatal(string msg) => _log.Warn(AppendClassLine(msg));
public static void Fatal(Exception ex, string msg = null) => _log.Fatal(msg, ex);
static string AppendClassLine(string msg)
{
string logStr = msg;
try
{
StackTrace st = new StackTrace(true);
StackFrame sf = st.GetFrame(2);
logStr = $"{msg} [{Path.GetFileName(sf.GetFileName())}:{sf.GetFileLineNumber().ToString()}]";
}
catch { }
return logStr;
}
}
注意:log4net本身自带输出类名和行号:在输出格式添加:[%class:%L]
但是,如果使用再次封装的类Logger,则输出的全是Logger的类名和行号,
我们此时想输入类名行号可以通过StackTrace来获取,config输出格式中则不用添加[%class:%L]。
五、验证效果: