log4net 配置
1、引入log4net.dll
2、在AssemblyInfo.cs添加代码
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
3、在webconfig或者appconfig中增加配置
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections>
4、创建应用程序配置文件log4net.config ,修改为始终复制
log4net.config的内容如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <log4net> <!--错误日志类--> <!--信息日志类--> <!--Debug日志类--> <root> <level value="ALL" /> <appender-ref ref="InfoAppender" /> <appender-ref ref="ErrorAppender"/> <appender-ref ref="DebugAppender"/> </root> <!--<logger name="loginfo"> <level value="ALL" /> <appender-ref ref="InfoAppender" /> </logger> <logger name="logerror"> <level value="ALL" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="logdebug"> <level value="ALL" /> <appender-ref ref="DebugAppender" /> </logger>--> <!--错误日志附加介质--> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质--> <param name="File" value="Log\\LogError\\" /> <!--日志输出到exe程序这个相对目录下--> <param name="AppendToFile" value="true" /> <!--输出的日志不会覆盖以前的信息--> <param name="MaxSizeRollBackups" value="100" /> <!--备份文件的个数--> <param name="MaxFileSize" value="10240" /> <!--当个日志文件的最大大小--> <param name="StaticLogFileName" value="false" /> <!--是否使用静态文件名--><!-- <param name="DatePattern" value="yyyyMMdd".htm"" />--> <!--日志文件名--> <param name="RollingStyle" value="Date" /> <!-- 等级过滤 只需要ERROR等级的LOG --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR"/> <levelMax value="ERROR"/> </filter> <!--文件创建的方式,这里是以Date方式创建--> <!--错误日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="异常时间:%d [%t] %n异常级别:%-5p %n异常内容:%m %n%n" /> </layout> </appender> <!--信息日志附加介质--> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Log\\LogInfo\\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyyMMdd'.txt'" /> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <param name="RollingStyle" value="Date" /> <!-- 等级过滤 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO"/> <levelMax value="INFO"/> </filter> <!--信息日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="日志时间:%d [%t] %n日志级别:%-5p %n日志内容:%m %n%n" /> </layout> </appender> <!--调试日志附加介质--> <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Log\\LogDebug\\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <!--<param name="DatePattern" value="yyyyMMdd".htm"" />--> <param name="RollingStyle" value="Date" /> <!-- 等级过滤 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="DEBUG"/> <levelMax value="DEBUG"/> </filter> <!--信息日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="日志时间:%d [%t] %n日志级别:%-5p %n日志内容:%m %n%n" /> </layout> </appender> </log4net> </configuration>
ConversionPattern中的一些注解
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):換行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
5、创建Log4netHelper,代码如下
public class Log4netHelper { #region /// <summary> /// /// </summary> /// <param name="msg"></param> public static void InfoLog(object msg) { log4net.ILog log = log4net.LogManager.GetLogger("loginfo"); Task.Run(() => log.Info(msg)); //异步 //Task.Factory.StartNew(() => log.Error(msg));// 这种异步也可以 //log.Error(msg); //这种也行跟你需要,性能越好,越强大,我还是使用异步方式 } public static void WriteInfoLog(object msg) { log4net.ILog logInfo = log4net.LogManager.GetLogger("InfoAppender"); Task.Run(() => logInfo.Info(msg)); //异步 //log.Error(msg); //这种也行跟你需要,性能越好,越强大,我还是使用异步方式 } /// <summary> /// /// </summary> /// <param name="msg"></param> public static void ErrorLog(object msg) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); Task.Run(() => log.Error(msg)); //异步 // Task.Factory.StartNew(() =>log.Error(msg));// 这种异步也可以 //log.Error(msg); //这种也行跟你需要,性能越好,越强大,我还是使用异步方式 } /// <summary> /// /// </summary> /// <param name="ex"></param> public static void ErrorLog(Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); Task.Run(() => log.Error(ex.Message.ToString() + "/r/n" + ex.Source.ToString() + "/r/n" + ex.TargetSite.ToString() + "/r/n" + ex.StackTrace.ToString())); } /// <summary> /// /// </summary> /// <param name="msg"></param> /// <param name="ex"></param> public static void ErrorLog(object msg, Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); if (ex != null) { Task.Run(() => log.Error(msg, ex)); //异步 } else { Task.Run(() => log.Error(msg)); //异步 } } #endregion }
6、在program.cs或者Global.asax中进行初始化
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(root + "/Log4net.config"));
7、使用
Log4netHelper.WriteInfoLog("测试日志写入2");