.NET Core log4net、NLog日志

NLog 基础使用
.NET Core 和 ASP.NET Core 中的日志记录 

1、NuGet引用
Install-Package log4net
Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore

Install-Package NLog.Extensions.Logging

2、Startup.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net.Config;
using log4net.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Swashbuckle.AspNetCore.Swagger;
using NLog.Web;
using NLog.Extensions.Logging;

namespace Web
{
    public class Startup
    {
        //为StartUp.cs添加属性
        public static ILoggerRepository repository { get; set; }
        public IConfiguration Configuration { get; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
       
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            #region Swagger

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
            });

            #endregion
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            #region log4net 方式1
            loggerFactory.AddLog4Net();
            #endregion

            #region log4net 方式2
            repository = log4net.LogManager.CreateRepository("NETCoreRepository");
            XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
            #endregion

            #region nlog
            string path = AppContext.BaseDirectory;
            loggerFactory.ConfigureNLog(path + @"\nlog.config");//或env.ConfigureNLog(path + @"\nlog.config");
            loggerFactory.AddNLog();         

            #endregion

            #region Swagger

            //启用中间件服务生成Swagger作为JSON终结点
            app.UseSwagger();
            //启用中间件服务对swagger-ui,指定Swagger JSON终结点
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            });

            #endregion

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

3、Program.cs

using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace Asset.WebAPI
{
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
      .UseServiceProviderFactory(new AutofacServiceProviderFactory())
      .ConfigureLogging((context, loggingBuilder) =>
      {
        loggingBuilder.AddFilter("System", LogLevel.Warning);//过滤掉命名空间
        loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);//过滤掉命名空间
        loggingBuilder.AddLog4Net(new Log4NetProviderOptions()
        {
          Log4NetConfigFileName = "log4net.config",
          Watch = true
        });
      })
      .ConfigureWebHostDefaults(webBuilder =>
      {
        webBuilder.UseStartup<Startup>();
      });
  }
}

3、DefaultController

using System;
using System.Collections.Generic;
using System.Net.Http;
using log4net;
using Microsoft.AspNetCore.Mvc;
using NLog;
using IdentityModel.Client;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;

namespace Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DefaultController : ControllerBase
    {
        private ILog logger = log4net.LogManager.GetLogger(Startup.repository.Name, typeof(DefaultController));
        private readonly Logger nLogger = NLog.LogManager.GetCurrentClassLogger();

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            LogHelper.Info(this,"212888");
            logger.Info("sdsdsd");

            nLogger.Info("3 Info Message" + DateTime.Now.ToString("yyyy-MM-dd"));
            nLogger.Error("4 Error Message" + DateTime.Now.ToString("yyyy-MM-dd"));

            return new string[] { "value1", "value2" };
        }
    }
}

4、log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- This section contains the log4net configuration settings -->
  <log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
    </appender>

    <!--<appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>-->

    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="Log/appLog_%date{yyyyMMdd}.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logfile/" /> 
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <staticLogFileName value="false" />
      <datePattern value="yyyyMMdd'.log'" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="ALL" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="FileAppender" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>

  </log4net>
</configuration>

5、nlog.config 【注意:rules 节点的顺序优先级

<?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">
  <targets>
    <!--屏幕打印消息-->
    <target name="console" xsi:type="ColoredConsole" layout="${longdate}> ${message}"/>
    <!--VS输出窗口-->
    <target name="debugger" xsi:type="Debugger" layout="${longdate} | ${level:padding=-5} | ${message}" />
    <!--保存至文件-->
    <target name="info" xsi:type="File" maxArchiveFiles="30" fileName="${basedir}/Logs/Info/info${shortdate}.txt"
            layout="${date:format=HH\:mm\:ss} | ${message}" />
    <!--保存至文件-->
    <target name="error" xsi:type="File" maxArchiveFiles="30" fileName="${basedir}/Logs/Error/error${shortdate}.txt"
            layout="${date:format=HH\:mm\:ss} | ${message} | ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
    <!-- write log message to database(数据库) -->
    <target name="database" xsi:type="Database"
            connectionString="Data Source=.;Initial Catalog=dbFinance;User ID=sa;Password=000000;Persist Security Info=True;">
      <commandText>
        INSERT INTO Log(Timestamp,Level,Message,Action,Amount,StackTrace) VALUES (@time_stamp, @level, @message, @action, @amount, @stacktrace);
      </commandText>
      <!-- database connection parameters -->
      <parameter name="@time_stamp" layout="${date}" />
      <parameter name="@level" layout="${level:uppercase=true}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@action" layout="${event-context:item=Action}" />
      <parameter name="@amount" layout="${event-context:item=Amount}" />
      <parameter name="@stacktrace" layout="${stacktrace}" />
    </target>
  </targets>
  <rules>
    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Error" final="true" />
    <!--<logger name="*" writeTo="console" />-->
    <!--<logger name="*" minlevel="Debug" writeTo="debugger" />-->
    <logger name="*" minlevel="Info" maxlevel="Info" writeTo="info" />
    <logger name="*" minlevel="Trace" writeTo="info" />
    <logger name="*" minlevel="Error" writeTo="error" />
    <logger name="*" minlevel="Error" writeTo="database" />
  </rules>
</nlog>

7、LogUtils.cs(推荐)

using log4net;
using log4net.Config;
using System;
using System.IO;

namespace CoreLibrary
{
    public class LogUtils
    {
        private static ILog _logger;
        private static volatile LogUtils instance = null;
        private static object lockHelper = new object();

        public static LogUtils GetLogUtilsService()
        {
            if (instance == null)
            {
                lock (lockHelper)
                {
                    if (instance == null)
                    {
                        instance = new LogUtils();
                        #region 如果 Startup.cs 已创建 CreateRepository,使用此方式
                        var repository = LogManager.GetRepository("NETCoreRepository");
                        _logger = LogManager.GetLogger(repository.Name, "InfoLogger");
                        #endregion

                        #region 如果 Startup.cs 未创建 CreateRepository,使用此方式
                        //var repository = LogManager.CreateRepository("NETCoreRepository");
                        //XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
                        //_logger = LogManager.GetLogger(repository.Name, "InfoLogger");
                        #endregion
                    }
                }
            }
            return instance;
        }

        public void Info(string message, Exception exception = null)
        {
            if (exception == null)
                _logger.Info(message);
            else
                _logger.Info(message, exception);
        }

        public void Warn(string message, Exception exception = null)
        {
            if (exception == null)
                _logger.Warn(message);
            else
                _logger.Warn(message, exception);
        }

        public void Error(string message, Exception exception = null)
        {
            if (exception == null)
                _logger.Error(message);
            else
                _logger.Error(message, exception);
        }
    }
}

*
*
*
8、LogHelper.cs

using System;
using log4net;
using System.Collections.Concurrent;

namespace Web
{
    public static class LogHelper
    {
        private static readonly ConcurrentDictionary<Type, ILog> Loggers = new ConcurrentDictionary<Type, ILog>();
        
        /// <summary>
        /// 获取记录器
        /// </summary>
        /// <param name="source">soruce</param>
        /// <returns></returns>
        private static ILog GetLogger(Type source)
        {
            if (Loggers.ContainsKey(source))
            {
                return Loggers[source];
            }
            else
            {
                ILog logger = LogManager.GetLogger(Startup.repository.Name, source);
                Loggers.TryAdd(source, logger);
                return logger;
            }
        }

        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="message">message</param>
        public static void Info(object source, object message)
        {
            Info(source.GetType(), message);
        }

        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="message">message</param>
        public static void Info(Type source, object message)
        {
            ILog logger = GetLogger(source);
            if (logger.IsInfoEnabled)
            {
                logger.Info(message);
            }
        }


        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="message">message</param>
        /// <param name="exception">ex</param>
        public static void Info(object source, object message, Exception exception)
        {
            Info(source.GetType(), message, exception);
        }

        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="message">message</param>
        /// <param name="exception">ex</param>
        public static void Info(Type source, object message, Exception exception)
        {
            GetLogger(source).Info(message, exception);
        }

    }
}

*
*
*

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用NLog日志记录到SqlServer的步骤: 1. 首先,需要在项目中安装NLogNLog.Web.AspNetCore包。可以使用NuGet包管理器或在项目文件中手动添加依赖项。 2. 在项目的appsettings.json文件中添加以下NLog配置: ``` "NLog": { "targets": { "database": { "type": "Database", "dbProvider": "System.Data.SqlClient", "connectionString": "Server=[server];Database=[database];User Id=[user];Password=[password];", "commandText": "INSERT INTO [Logs] ([Date], [Level], [Logger], [Message], [Exception]) VALUES (@Date, @Level, @Logger, @Message, @Exception);", "parameter": [ { "name": "@Date", "layout": "${date}" }, { "name": "@Level", "layout": "${level}" }, { "name": "@Logger", "layout": "${logger}" }, { "name": "@Message", "layout": "${message}" }, { "name": "@Exception", "layout": "${exception}" } ] } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "database" } ] } ``` 3. 在Startup.cs文件中添加以下代码: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { //... loggerFactory.AddNLog(); //... app.UseMiddleware<NLogMiddleware>(); //... } ``` 4. 创建一个名为Logs的表,用于存储日志记录。表结构应如下所示: ```sql CREATE TABLE [dbo].[Logs]( [Id] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime2](7) NOT NULL, [Level] [nvarchar](50) NOT NULL, [Logger] [nvarchar](250) NOT NULL, [Message] [nvarchar](max) NOT NULL, [Exception] [nvarchar](max) NULL, CONSTRAINT [PK_Logs] 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] TEXTIMAGE_ON [PRIMARY] ``` 5. 现在,可以在代码中使用NLog记录日志了。例如: ```csharp private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { _logger.LogInformation("Hello, world!"); return View(); } ``` 这将在Logs表中插入一条日志记录。 希望这可以帮助到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值