Core 2.0使用Nlog记录日志+Mysql

一、先创建一个Core2.0的项目,并在NuGet中引入3个类库文件

MySql.Data.dll
NLog.dll
NLog.Web.AspNetCore.dll

二、创建一个nlog.config文件。这个文件的属性中的 “复制到输出目录”改为:始终复制

<?xml version="1.0" ?>
<nlog autoReload="true" internalLogFile="file.txt"> 如果日志写入失败,会把错误写入此文件
  <targets>
    <target type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"  
name="database" connectionstring="Data Source=XXXXXXXXX;initial catalog=log;user id=XXXXX;password=XXXXX;SslMode=none"> <commandText> INSERT INTO logs(Date,Thread,Level,Logger,Message,domain,errortype) VALUES (@log_date, @thread, @log_level, @logger, @message,@domain,@errortype) </commandText> <parameter name="@log_date" layout="${event-context:item=log_date}" /> <parameter name="@thread" layout="${event-context:item=thread}" /> <parameter name="@log_level" layout="${event-context:item=log_level}" /> <parameter name="@logger" layout="${event-context:item=logger}" /> <parameter name="@message" layout="${event-context:item=message}" /> <parameter name="@domain" layout="${event-context:item=domain}" /> <parameter name="@errortype" layout="${event-context:item=errortype}" /> </target> </targets> <rules> <logger name="*" minlevel="Debug" appendTo="database" /> </rules> </nlog>

nlog.config文件说明:

<targets />声明目标

<rules />声明规则

(1)路由规则详情(rules):

<rules />区域定义了日志的路由规则。每一个路由表项就是一个<logger />元素。<logger />有以下属性:

name - 日志源/记录者的名字 (允许使用通配符*)
minlevel - 该规则所匹配日志范围的最低级别
maxlevel - 该规则所匹配日志范围的最高级别
level - 该规则所匹配的单一日志级别
levels - 该规则所匹配的一系列日志级别,由逗号分隔。
writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。
final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。
如:
1、名字空间Name.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
2、名字空间Name.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> 
3、名字空间Name.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。
 <logger name="Name.Space.*" writeTo="f3,f4" /> 
4、 名字空间Name.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),
同时其它后续规则也都会被忽略(因为这里设置了final="true")。
 <logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> 

 (2)自动再配置:

       听起来确实挺不好理解的。但是确实也没什么。换句简单的话来说,当我们一旦启动程序,这时候NLog.config文件被读取后,知道程序再启动都不会再读取配置文件了。假如我们不想停掉程序,比如说服务器哪能说停就停哈。这就用上这个配置了,这个配置功能是,一旦你对配置文件修改,程序将会重新读取配置文件,也就是自动再配置。直接上代码:

<nlog autoReload="true">
   ...
</nlog>

(3)日志排错

<nlog throwExceptions="true" />    
<nlog internalLogFile="file.txt" />- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 决定内部日志的级别,级别越高,输出的日志信息越简洁。
<nlog internalLogToConsole="false|true" /> - 是否把内部日志输出到标准控制台。
<nlog internalLogToConsoleError="false|true" /> - 是否把内部日志输出到标准错误控制台 (stderr)。
 设置throwExceptions属性为“true”可以让NLog不再阻挡这类异常,而是把它们抛给调用者。在部署是这样做可以帮我们快速定位问题。一旦应用程序已经正确配置了,
我们建议把throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃

(4)异步处理,使其具备异步处理能力

<nlog>
  <targets async="true">
    <!-- all targets in this section will automatically be asynchronous -->
  </targets>
</nlog>

 

 

三、修改Startup文件,添加 ILoggerFactory loggerFactory

    public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
        {
//新天加的日志配置 loggerFactory.AddNLog(); env.ConfigureNLog(
"nlog.config");

if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }

修改program文件,添加配置UseNlog()

四、开始添加内容

  static NLog.ILogger logger = NLog.LogManager.GetCurrentClassLogger();

        public IActionResult Index()
        {
            LogEventInfo log = new LogEventInfo();
            log.Properties["log_level"] = "9";
            log.Properties["log_date"] = DateTime.Now;
            log.Properties["thread"] = 7;
            log.Properties["logger"] = "big";
            log.Properties["domain"] = "www.xiaoyaodijun.com";
            log.Properties["message"] = "时光悠悠,碧水长流";
            log.Properties["errortype"] = "core .server";
            logger.Debug(log);

            return View();
        }

五、可以直接在数据库看结果了

 

配置参考来源:https://www.cnblogs.com/fuchongjundream/p/3936431.html

posted @ 2018-07-10 17:12  逍遥帝君  阅读(1208)  评论(0编辑  收藏  举报