关于Log4Net和NLog使用的帮助文档

NLog和Log4Net的使用

一、NLog–记录文本日志

1.Nuget引入程序集

NLog.Web.AspNetCore   					日志记录驱动程序
NLog.Config    		  					配置文件

2.修改配置文件

注意:这类默认的配置文件,是只读的,我是复制出来,修改好了,然后替换进去的

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> 
  <!--Optional, add some variables  
      可选,添加一些变量
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs. 
  看见https://github.com/nlog/nlog/wiki/Configuration-file
  有关自定义日志记录规则和输出的信息。
   -->
  
  <targets> 
    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. 
    在这里添加您的目标 
    看见https://github.com/nlog/NLog/wiki/Targets 寻找可能的目标。 
    看见https://github.com/nlog/NLog/wiki/Layout-Renderers 对于可能的布局渲染器。 
    --> 
    
    <!--
      同样是将文件写入日志中,写入的内容有所差别,
      差别在layout属性中体现。写入日志的数量有差别,差别在路由逻辑中体现
    -->
    
    <target xsi:type="File" name="allfile" fileName="Log\nlog-all-${shortdate}.log"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />  
    <target xsi:type="File" name="ownFile-web" fileName="Log\nlog-my-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="Null" name="blackhole" />
    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
 
    <!--配置写入数据库-->
    <!-- Remarks:
            The appsetting layouts require the NLog.Extended assembly.
            The aspnet-* layouts require the NLog.Web assembly.
            The Application value is determined by an AppName appSetting in Web.config.
            The "NLogDb" connection string determines the database that NLog write to.
            The create dbo.Log script in the comment below must be manually executed.
            
            appsetting布局需要NLog.Extended程序集。 
            aspnet-*布局需要NLog.Web程序集。 
            应用程序值由Web.config中的AppName appSetting确定。 
           “NLogDb”连接字符串确定NLog写入的数据库。 
            必须手动执行下面注释中的create dbo.Log脚本。 
            Script for creating the dbo.Log table.

            SET ANSI_NULLS ON
            SET QUOTED_IDENTIFIER ON
            CREATE TABLE [dbo].[NLogManager] (
                [Id] [int] IDENTITY(1,1) NOT NULL,
                [Application] [nvarchar](50) NOT NULL,
                [Logged] [datetime] NOT NULL,
                [Level] [nvarchar](50) NOT NULL,
                [Message] [nvarchar](max) NOT NULL,
                [Logger] [nvarchar](250) NULL,
                [Callsite] [nvarchar](max) NULL,
                [Exception] [nvarchar](max) NULL,
              CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)
                WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
            ) ON [PRIMARY] -->

    <target name="AllDatabase" xsi:type="Database"
            dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
            connectionString="Data Source=DESKTOP-VUL99EF;Initial Catalog=CustomerDB;Persist Security Info=True;User ID=sa;Password=sa123;"
            commandText="insert into dbo.NLogManager (Application, Logged, Level, Message,Logger, CallSite, Exception) values (@Application, @Logged, @Level, @Message,@Logger, @Callsite, @Exception);">
          <parameter name="@application" layout="AspNetCoreNlog" /> 
          <parameter name="@logged" layout="${date}" />
          <parameter name="@level" layout="${level}" />
          <parameter name="@message" layout="${message}" /> 
          <parameter name="@logger" layout="${logger}" />
          <parameter name="@callSite" layout="${callsite:filename=true}" />
          <parameter name="@exception" layout="${exception:tostring}" />
    </target>

  </targets>

  <rules>
    <!-- add your logging rules here --> 
    <!--写入到数据库中-->
    <logger name="*" minlevel="debug" writeTo="AllDatabase" /> 
    
    <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。--> 
    <!--All logs, including from Microsoft-->
    
    <!--<logger name="*" minlevel="Trace" writeTo="allfile" />-->
    
    <!--Skip Microsoft logs and so log only own logs-->
     
    <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略-->
    <!--
    -->
    <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由-->
    
    <!--<logger name="Microsoft.*" minlevel="Trace"  final="true" />-->
    
    <!--上方已经过滤了所有Microsoft.*的日志,所以此处的日志只会打印除Microsoft.*外的日志-->
    <!--<logger name="*" minlevel="Trace" writeTo="ownFile-web" />-->
 
    <!-- 
          Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
          <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>

3.ASP.NET Core程序支持

public static void Main(string[] args)
{
	 //读取配置文件
     NLogBuilder.ConfigureNLog("CfgFile/NLog.config");      
     CreateHostBuilder(args).Build().Run();        
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }) 
                .UseNLog();

4.程序写日志

构造函数注入即可

public class FirstController : Controller
{
        private readonly ILogger<FirstController> _ILogger; 
        private readonly ILoggerFactory _ILoggerFactory; 
        public FirstController(ILogger<FirstController> logger, ILoggerFactory iLoggerFactory)
        {
            this._ILogger = logger;
            _ILogger.LogInformation($"{this.GetType().FullName} 被构造。。。。LogInformation");
            _ILogger.LogError($"{this.GetType().FullName} 被构造。。。。LogError");
            _ILogger.LogDebug($"{this.GetType().FullName} 被构造。。。。LogDebug");
            _ILogger.LogTrace($"{this.GetType().FullName} 被构造。。。。LogTrace");
            _ILogger.LogCritical($"{this.GetType().FullName} 被构造。。。。LogCritical");

            this._ILoggerFactory = iLoggerFactory;
            ILogger<FirstController> _ILogger2 = _ILoggerFactory.CreateLogger<FirstController>(); 
            _ILogger2.LogInformation("这里是通过Factory得到的Logger写的日志"); 
        }
 }

二、Nlog–记录数据库日志

1.Nuget引入程序集

Microsoft.Data.SqlClient

2.修改配置文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> 
  <!--Optional, add some variables  
      可选,添加一些变量
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs. 
  看见https://github.com/nlog/nlog/wiki/Configuration-file
  有关自定义日志记录规则和输出的信息。
   -->
  
  <targets> 
    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. 
    在这里添加您的目标 
    看见https://github.com/nlog/NLog/wiki/Targets 寻找可能的目标。 
    看见https://github.com/nlog/NLog/wiki/Layout-Renderers 对于可能的布局渲染器。 
    --> 
    
    <!--
      同样是将文件写入日志中,写入的内容有所差别,
      差别在layout属性中体现。写入日志的数量有差别,差别在路由逻辑中体现
    -->
    
    <!--<target xsi:type="File" name="allfile" fileName="Log\nlog-all-${shortdate}.log"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />  
    
    <target xsi:type="File" name="ownFile-web" fileName="Log\nlog-my-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />-->
 
    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
 
    <!--配置写入数据库-->
    <!-- Remarks:
            The appsetting layouts require the NLog.Extended assembly.
            The aspnet-* layouts require the NLog.Web assembly.
            The Application value is determined by an AppName appSetting in Web.config.
            The "NLogDb" connection string determines the database that NLog write to.
            The create dbo.Log script in the comment below must be manually executed.
            
            appsetting布局需要NLog.Extended程序集。 
            aspnet-*布局需要NLog.Web程序集。 
            应用程序值由Web.config中的AppName appSetting确定。 
           “NLogDb”连接字符串确定NLog写入的数据库。 
            必须手动执行下面注释中的create dbo.Log脚本。 
            Script for creating the dbo.Log table.

            SET ANSI_NULLS ON
            SET QUOTED_IDENTIFIER ON
            CREATE TABLE [dbo].[NLogManager] (
                [Id] [int] IDENTITY(1,1) NOT NULL,
                [Application] [nvarchar](50) NOT NULL,
                [Logged] [datetime] NOT NULL,
                [Level] [nvarchar](50) NOT NULL,
                [Message] [nvarchar](max) NOT NULL,
                [Logger] [nvarchar](250) NULL,
                [Callsite] [nvarchar](max) NULL,
                [Exception] [nvarchar](max) NULL,
              CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)
                WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
            ) ON [PRIMARY] -->

    <target name="AllDatabase" xsi:type="Database"
            dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
            connectionString="Data Source=DESKTOP-VUL99EF;Initial Catalog=CustomerDB;Persist Security Info=True;User ID=sa;Password=sa123;"
            commandText="insert into dbo.NLogManager (Application, Logged, Level, Message,Logger, CallSite, Exception) values (@Application, @Logged, @Level, @Message,@Logger, @Callsite, @Exception);">
          <parameter name="@application" layout="AspNetCoreNlog" /> 
          <parameter name="@logged" layout="${date}" />
          <parameter name="@level" layout="${level}" />
          <parameter name="@message" layout="${message}" /> 
          <parameter name="@logger" layout="${logger}" />
          <parameter name="@callSite" layout="${callsite:filename=true}" />
          <parameter name="@exception" layout="${exception:tostring}" />
    </target>

  </targets>

  <rules>
    <!-- add your logging rules here --> 
    <!--写入到数据库中-->
    <logger name="*" minlevel="debug" writeTo="AllDatabase" /> 
    
    <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。--> 
    <!--All logs, including from Microsoft-->
    
    <logger name="*" minlevel="Trace" writeTo="allfile" />
    
    <!--Skip Microsoft logs and so log only own logs--> 
    <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略-->
    <!--
    -->
    <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由-->
    
    <logger name="Microsoft.*" minlevel="Trace"  final="true" />
    
    <!--上方已经过滤了所有Microsoft.*的日志,所以此处的日志只会打印除Microsoft.*外的日志-->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
 
    <!-- 
          Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
          <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>

3.执行数据库脚本

其实就是生成一个用来保存日志数据的表,还要对应于这个数据库,生成数据库链接字符串配置到配置文件中去

SET ANSI_NULLS ON
            SET QUOTED_IDENTIFIER ON
            CREATE TABLE [dbo].[NLogManager] (
                [Id] [int] IDENTITY(1,1) NOT NULL,
                [Application] [nvarchar](50) NOT NULL,
                [Logged] [datetime] NOT NULL,
                [Level] [nvarchar](50) NOT NULL,
                [Message] [nvarchar](max) NOT NULL,
                [Logger] [nvarchar](250) NULL,
                [Callsite] [nvarchar](max) NULL,
                [Exception] [nvarchar](max) NULL,
              CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)
                WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
            ) ON [PRIMARY]

4.读取配置文件,配置使用Nlog

public static void Main(string[] args)
        {
            //NLogBuilder.ConfigureNLog("CfgFile/NLog.config"); 
            NLogBuilder.ConfigureNLog("CfgFile/NLog.config");
            CreateHostBuilder(args).Build().Run();
        }
 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })

                //支持记录NLog日志
                .ConfigureLogging(builder =>
                {
                    builder.ClearProviders(); //删除掉其他已经注册过的ILogger实现程序
                    builder.SetMinimumLevel(LogLevel.Debug);
                })
                .UseNLog();

三、NLog配置文件的拓展

配置信息拓展:

Logger标签对,控制输出范围与水平

name属性:

指定哪些代码段要输出信息,例如:“<logger name=“SomeNamespace.Component.*” …”,只输出SomeNamespace.Component域里面打印的信息。

minLevel属性:

指定输出等级,Logging 水平分为以下等级“Trace<<Debug<<Info<<Warn<<Error<<Fatal ”,如果我们选择Info值,则Trace和Debug等级的信息不会被输出。

writeTo属性:

​ 指定使用那个“Target标签对”来输出信息

Final属性:

​ 这个属性若设置为true,则被当前Logger标签对输出的消息类型,不再被下一个Logger标签对处理。

Target标签对,输出格式,输出到哪里

Name属性:

target标签对的名称

Type属性:

target的类型,比如target=”File”。还有“Database”,“Mail”,“Network”等类型。

Silverlight使用文件输出,需将项目设置为Out of browser模式

fileName属性:

若target类型为File,则可以指定输出文件名。

例:

fileName=”file.txt”,

fileName="${basedir}/App_Data/log.txt",

fileName="${basedir}/log.txt",

fileName =" s p e c i a l f o l d e r : M y D o c u m e n t s / l o g . {specialfolder:MyDocuments}/log. specialfolder:MyDocuments/log.{shortdate}.txt"

fileName="${logger}.txt"

fileName="${shortdate}.txt"

fileName="${windows-identity:domain=false}.txt

fileName=" s h o r t d a t e / {shortdate}/ shortdate/{windows-identity:domain=false}.txt"

如果是Silverlight项目可能不能指定输出文件到App_Data目录下。

Layout属性:

格式化输出日志信息。例:

layout=" d a t e : f o r m a t = H H   m m   s s ∣ {date:format=HH\:mm\:ss}| date:format=HHmmss{level}| s t a c k t r a c e ∣ {stacktrace}| stacktrace{message}"

layout="[ d a t e : f o r m a t = y y y y − M M − d d H H   m m   s s ] [ {date:format=yyyy-MM-ddHH\:mm\:ss}][ date:format=yyyyMMddHHmmss][{level}] ${message} ${exception}"

layout=" l o n g d a t e {longdate} longdate{callsite} ${level} ${message}"

address属性:

指定日志信息输出到哪个网络服务器,例:

<targetname=“n1” xsi:type="Network"address=“tcp://localhost:4001”/>

四、Log4Net记录日志

1.Nuget引入程序集

log4net

2.增加配置文件

注意:配置文件信息,建议设置属性为始终复制

<?xml version="1.0" encoding="utf-8"?>
<log4net>
	<!-- Define some output appenders -->
	<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
		<file value="log\log.txt" />
		<!--追加日志内容-->
		<appendToFile value="true" />

		<!--防止多线程时不能写Log,官方说线程非安全-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

		<!--可以为:Once|Size|Date|Composite-->
		<!--Composite为Size和Date的组合-->
		<rollingStyle value="Composite" />

		<!--当备份文件时,为文件名加的后缀-->
		<datePattern value="yyyyMMdd.TXT" />

		<!--日志最大个数,都是最新的-->
		<!--rollingStyle节点为Size时,只能有value个日志-->
		<!--rollingStyle节点为Composite时,每天有value个日志-->
		<maxSizeRollBackups value="20" />

		<!--可用的单位:KB|MB|GB-->
		<maximumFileSize value="3MB" />

		<!--置为true,当前最新日志文件名永远为file节中的名字-->
		<staticLogFileName value="true" />

		<!--输出级别在INFO和ERROR之间的日志-->
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="ALL" />
			<param name="LevelMax" value="FATAL" />
		</filter>
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
		</layout>
	</appender>
	<root>
		<priority value="ALL"/>
		<level value="ALL"/>
		<appender-ref ref="rollingAppender" />
	</root>
</log4net>

3、ASP.NET Core生效log4net

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
 		    //支持Log4Net
            .ConfigureLogging(builder =>
            {
                builder.AddLog4Net("CfgFile/log4net.Config");
            });

4.写日志

可通过Logger或者LogerFactory注入来写日志

public class FirstController : Controller
{

        private readonly ILogger<FirstController> _ILogger; 
        private readonly ILoggerFactory _ILoggerFactory; 
        public FirstController(ILogger<FirstController> logger, ILoggerFactory iLoggerFactory)
        {
            this._ILogger = logger;
            _ILogger.LogInformation($"{this.GetType().FullName} 被构造。。。。LogInformation");
            _ILogger.LogError($"{this.GetType().FullName} 被构造。。。。LogError");
            _ILogger.LogDebug($"{this.GetType().FullName} 被构造。。。。LogDebug");
            _ILogger.LogTrace($"{this.GetType().FullName} 被构造。。。。LogTrace");
            _ILogger.LogCritical($"{this.GetType().FullName} 被构造。。。。LogCritical");

            this._ILoggerFactory = iLoggerFactory;
            ILogger<FirstController> _ILogger2 = _ILoggerFactory.CreateLogger<FirstController>(); 
            _ILogger2.LogInformation("这里是通过Factory得到的Logger写的日志"); 
        }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焦糖丨玛奇朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值