1、下载log4net并添加引用或通过NuGet安装程序包
2、配置文件中添加配置
在配置文件web.config或App.config中的Configuration节点下增加以下配置
<configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><appender name="Console" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><!-- Pattern to output the caller's file name and line number --><conversionPattern value="%5level [%thread] (%file:%line) - %message%newline"/></layout></appender><!--定义输出到文件中--><appender name="RollingFile" type="log4net.Appender.RollingFileAppender"><!--定义文件存放位置--><file value="App_Log\\log"/><!--是否追加到文件--><appendToFile value="true"/><!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--><maxSizeRollBackups value="-1"/><!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--><rollingStyle value="Composite"/><datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/><!--是否只写到一个文件中--><staticLogFileName value="false"/><!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--><maximumFileSize value="100MB"/><!--计数类型为1,2,3…--><param name="CountDirection" value="1"/><layout type="log4net.Layout.PatternLayout"><!--输出格式-样例:记录时间:2022-08-24 17:59:31,172 线程ID:[4] 日志级别:INFO 出错类:Log4NetDemo.MainClass 属性:[UserName:John] 日志描述:创建连接失败。--><conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level %n出错类:%logger 属性:[UserName:%property{UserName}] %n日志描述:%message%newline %n"/></layout></appender><root><!--日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL--><level value="ALL"/><!--<appender-ref ref="Console"/>--><appender-ref ref="RollingFile"/></root></log4net>
3、编写日志写入帮助类
注意,在命名空间上方要加代码:[assembly: log4net.Config.XmlConfigurator(Watch = true)],才能正确读取配置文件中的内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Demo.Helper
{/// <summary>/// 日志帮助类/// </summary>public class LogHelper{#region 输出日志到Log4Net/// <summary>/// 输出日志到Log4Net/// </summary>/// <param name="t"></param>/// <param name="ex">异常对象</param>/// <param name="level">日志等级,默认为:1 Debug 级</param>public static void WriteLog(Type t, Exception ex, LogLevel level = LogLevel.DEBUG){WriteLog(t, ex.Message, level);}#endregion#region 输出日志到Log4Net/// <summary>/// 输出日志到Log4Net/// </summary>/// <param name="t"></param>/// <param name="msg">错误信息</param>/// <param name="level">日志等级,默认为:1 Debug 级</param>public static void WriteLog(Type t, string msg, LogLevel level = LogLevel.DEBUG){// 对应日志信息中的“%property{UserName}”//log4net.ThreadContext.Properties["UserName"] = "Test";log4net.ILog log = log4net.LogManager.GetLogger(t);switch (level){// 日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALLcase LogLevel.DEBUG:log.Debug(msg);break;case LogLevel.INFO:log.Info(msg);break;case LogLevel.WARN:log.Warn(msg);break;case LogLevel.ERROR:log.Error(msg);break;case LogLevel.FATAL:log.Fatal(msg);break;default:log.Debug(msg);break;}}#endregion}/// <summary>/// 日志等级:/// OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL/// </summary>public enum LogLevel{/// <summary>/// ALL/// </summary>ALL = 0,/// <summary>/// DEBUG/// </summary>DEBUG = 1,/// <summary>/// INFO/// </summary>INFO = 2,/// <summary>/// WARN/// </summary>WARN = 3,/// <summary>/// ERROR/// </summary>ERROR = 4,/// <summary>/// FATAL/// </summary>FATAL = 5,/// <summary>/// OFF/// </summary>OFF = 6}
}
4、通过日志帮助类调用方法写入日志信息
using System;namespace Demo
{static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>static void Main(){LogHelper.WriteLog(typeof(Demo), "输出日志信息。", LogLevel.INFO);}}
}
5、日志样式
记录时间:2022-08-24 17:58:48,881 线程ID:[4] 日志级别:INFO
出错类:Demo 属性:[UserName:John]
日志描述:监听启动中...记录时间:2022-08-24 17:58:48,912 线程ID:[4] 日志级别:DEBUG
出错类:Demo 属性:[UserName:John]
日志描述:创建连接。记录时间:2022-08-24 17:59:10,167 线程ID:[4] 日志级别:ERROR
出错类:Demo 属性:[UserName:John]
日志描述:连接失败。