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);
}
}
}
*
*
*