第一步:安装nuget log4net包
第二步:新建log4net.config配置文件,配置日志输出格式
<?xml version="1.0"?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/></configSections><appSettings><add key="WebSocketPort" value="45154" /></appSettings><log4net><!--指定日记记录方式,以滚动文件的方式(文件记录)--><appender name="logInfoToFile" type="log4net.Appender.RollingFileAppender,log4net"><!--日志路径--><file value="logs/log4net/info"/><!--是否是向文件中追加日志--><AppendToFile value="true"/><!--日志根据日期滚动--><RollingStyle value="Date"/><!--日志文件名格式为:info.2021-12-30.txt--><DatePattern value="'.'yyyy-MM-dd'.txt'"/><!--日志文件名是否是固定不变的--><StaticLogFileName value="false"/><!--布局--><layout type="log4net.Layout.PatternLayout,log4net"><ConversionPattern value="%d %-5p [%c] %m%n"/></layout></appender><appender name="logErrorToFile" type="log4net.Appender.RollingFileAppender,log4net"><file value="logs/log4net/error"/><AppendToFile value="true"/><RollingStyle value="Date"/><!--日志文件名格式为:error.2021-12-30.txt--><DatePattern value="'.'yyyy-MM-dd'.txt'"/><StaticLogFileName value="false"/><layout type="log4net.Layout.PatternLayout,log4net"><ConversionPattern value="%d %-5p [%c] %m%n"/></layout></appender><!-- 根(父)logger --><root><!-- 支持级别:ALL --><level value="ALL" additivity="false"/><!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF--><!-- 支持的appender名称:logInfoToFile --><appender-ref ref="logInfoToFile"/></root><!-- logger名称为ApplicationInfoLog,阻止父logger中的appender --><logger name="ApplicationInfoLog" additivity="false"><!-- 支持级别:ALL --><level value="ALL"/><!-- 支持的appender名称:logInfoToFile --><appender-ref ref="logInfoToFile"/></logger><logger name="ApplicationErrorLog" additivity="false"><!-- 支持级别:ALL --><level value="ALL"/><!-- 支持的appender名称:logErrorToFile --><appender-ref ref="logErrorToFile"/></logger></log4net>
</configuration>
或者 在项目的.csproj文件添加如下代码:
<ItemGroup><Content Update="log4net.config"><CopyToOutputDirectory>Always</CopyToOutputDirectory></Content>
</ItemGroup>
第三步 控制器 代码内容
[ApiController][Route("[controller]/[action]")]public class HomeController : Controller{private readonly ILogger<HomeController> _logger;public HomeController(ILogger <HomeController> logger) {_logger = logger;}[HttpGet]/// <summary>/// 获取日志输出 /// </summary>/// <returns></returns>public void GetLogOnUniversalHost() {ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");log.Info(".NET Core Log4net log1");log.Info("test log1");log.Error("error1");log.Info("linezero1");}
第四步:在启动项中添加Log配置替换默认的日志提供程序,在控制器中编写具体输出内容
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureLogging(logging => // 添加提供程序(通用主机){logging.ClearProviders(); // 去掉默认添加的日志提供程序logging.AddConsole();logging.AddDebug();logging.AddEventSourceLogger();logging.AddEventLog();}).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup < Startup > ();});
运行之后
第五步关于logger节点配置详解
1:Log4Net结构
Log4net主要分为5个核心组件: Logger, Appender, Filter, Layout, Object Render。
2:Logger介绍
Logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。Logger主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。
log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。
3:Appender介绍
Appender提供记录的介质,我们可能要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置。
我们可以通过Appender配置实现,而且Log4Net当中已经默认提供了一些常用的Appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。
4:Filter介绍
Filter就是过滤器,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。
5:Layout介绍
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。
6:Object Render介绍
Object Render将告诉logger如何把一个对象转化为一个字符串记录到日志里。ILog中定义的记录日志的方法接收的参数是Object,而不是String。
例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。
7:logger节点配置
name 必须的, logger的名称, 在代码中得到ILog对象时用到。
additivity可选, 取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。
logger支持的子元素: level、appender-ref、param。
level 最多一个。 在这个级别或之上的才会被记录。OFF、FATAL、ERROR、WARN 、INFO、DEBUG、ALL
appender-ref 0个或多个,要引用的appender的名字。
param 0个或多个,设置一些参数。
8:日志级别等级
高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
9:ILog对象说明
ILog是实现Logger的一个接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法都有1个重载,以Debug为例说明一下,其它的和它差不多。
ILog中对Debug方法的定义如下:
void Debug(object message);
void Debug(object message, Exception exception);
还有一个布尔属性:
bool IsDebugEnabled { get; }
如果使用Debug(object message, Exception exception)则无论Layout如何配置,日志都会输出Exception信息,包括Exception的Message和Trace。如果使用Debug(object message),则无论Layout如何配置是不会输出Exception信息的。
在代码中可以使用LogManager类来得到Logger配置下的相应的ILog对象,LogManager类用来管理所应得Logger,它的GetLogger静态方法,可以获得配置文件中相应的Logger,代码如下:
ILog log = LogManager.GetLogger(“logger-name”)
10:appender节点配置详解
1:appender节点配置
支持的属性:name、type(name属性必须唯一,type属性必须指定)。
name 必须的,appender对象的名称
type 必须的,appender对象的输出类型
常用的子元素:appender-ref、filter、layout、param
appender-ref 0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。
filter 0个或多个,定义此appender使用的过滤器。
ayout 最多一个。定义appender使用的输出格式。
param 0个或多个, 设置Appender类中对应的属性的值。
2:appender的输出方式(type属性)
AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。ConsoleAppender 将日志输出到应用程序控制台。EventLogAppender 将日志写到Windows Event Log。FileAppender 将日志输出到文件。ForwardingAppender 发送日志事件到子Appenders。LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下)。MemoryAppender 将日志存到内存缓冲区。NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。OutputDebugStringAppender 将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。RemotingAppender 通过.NET Remoting将日志写到远程接收端。RollingFileAppender 将日志以回滚文件的形式写到文件中。SmtpAppender 将日志写到邮件中。SmtpPickupDirAppender 将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。TelnetAppender 客户端通过Telnet来接受日志事件。TraceAppender 将日志写到.NET trace 系统。UdpAppender 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。
11:filter节点配置
filter只能作为的子元素,type属性表示Filter的类型。常用子元素数量0个或多个,作用设置一些参数。
1:filter的类型说明DenyAllFilter 阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录LevelRangeFilter 日志等级在指定范围内的事件才被记录LoggerMatchFilter Logger名称匹配,才记录PropertyFilter 消息匹配指定的属性值时才被记录StringMathFilter 消息匹配指定的字符串才被记录MdcFilterNdcFilter
12:Layout节点配置详解
1:layout节点配置
layout节点只能作为的子元素。type属性表示Layout的类型。常用子元素数量0个或多个,作用设置一些参数。
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。最常用的Layout应该是用户自定义格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。然后还有4个Layout,其中有两个是输出Xml的Layout,但是中文会有问题。ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。
2:layout节点的type属性取值
ExceptionLayout 只呈现日志事件中异常的文本信息
PatternLayout 可以通过类型字符串来配置的布局RawPropertyLayout 从日志事件中提取属性值RawTimeStampLayout 从日志事件中提取日期RawUtcTimeStampLayout 从日志事件中提取UTC日期SimpleLayout 很简单的布局XmlLayout 把日志事件格式化为XML元素的布局
3:PatterLayout的格式化字符串
%m、%message 输出的日志消息
%d、%datetime 输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}%r、%timestamp 输出程序从运行到执行到当前语句时消耗的毫秒数%p、%level 日志的当前优先级别%c、%logger 当前日志对象的名称%L、%line 输出语句所在的行号%F、%file 输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能%a、%appdomain 引发日志事件的应用程序域的名称。%C、%class、%type 引发日志请求的类的全名,警告:会影响性能%exception 异常信息%u、%identity 当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能%l、%location 引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件%M、%method 发生日志请求的方法名,警告:会影响性能%n、%newline 换行符%x、%ndc NDC(nested diagnostic context)%X、%mdc、%P、%properties 等介于 %property%property 输出{log4net:Identity=, log4net:UserName=, log4net:HostName=} %t、%thread 引发日志事件的线程,如果没有线程名就使用线程号。%w、%username 当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能%utcdate 发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}%% 输出一个百分号
4:PatterLayout格式修饰符
格式修饰符 对齐 最小宽 最大宽 说明
%20logger 右对齐 20 无 如果logger名不足20个字符,就在左边补空格%-20logger 左对齐 20 无 如果logger名不足20个字符,就在右边补空格%.30logger 左对齐 无 30 超过30个字符将截断%20.30logger 右对齐 20 30 logger名要在20到30之间,少了在左边补空格,多了截断%-20.30logger 左对齐 20 30 logger名要在20到30之间,少了在右边补空格,多了截断
13 : 其它节点的说明与配置
1:param节点
元素可以是如何元素的子元素,包含的属性:name、value、type。name:必须的,取值是父对象的参数名。value:可选的,value是一个能被转化为参数值的字符串。type:可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。2:root节点
root节点的作用是所有其它logger都默认继承它。root元素没有属性。root节点的子元素与logger一样有appender-ref、level、param。
3:log4net节点
Log4net节点是整个日志配置的根节点,包含的属性:debug、update、threshold。debug:可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。update:可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。threshold:可选,取值是repository(库)中注册的level,默认值是ALL。
Log4net节点支持的子元素:appender(0或多个)、logger (0或多个)、renderer (0或多个)、root(最多一个)、param(0或多个)。
4:关联配置文件
log4net默认关联的是应用程序的配置文件App.config或Web.config,可以使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:log4net.Config.XmlConifguratorAttribute。
XmlConfiguratorAttribute有3个属性:ConfigFile、ConfigFileExtension、Watch。ConfigFile:配置文件的名字,文件路径相对于应用程序目录。ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用。Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载。例如:
//监视默认的配置文件,App.exe.config
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
//配置文件:App.exe.log4net[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net")]//配置文件:log4net.config[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));