WPF下使用NLog

1 篇文章 0 订阅

1 先从nuget中现在Nlog,由于我使用的是.net core 3.0 所以下载如图的Nlog 

2 创建Nlog.config配置文件

<?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"
      autoReload="true"> 
 <!--<variable name="LogDir" value="LogDir"/>-->
  <targets>

    <!-- Log in a separate thread, possibly queueing up to
        5000 messages. When the queue overflows, discard any
        extra messages-->

    <!-- write logs to file -->
    <target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
      <target xsi:type="File" fileName="${basedir}/logs/${shortdate}/${Other}/${shortdate}.log" 
              layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace}" />
    </target>

    <!-- write log message to database -->
    <target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
      <target type="Database" dbProvider="mssql"
              connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=EFinance;Persist Security Info=True;User ID=sa;Password=123456;">
        <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>
    </target>

    <!--write log message to Visual Studio Output-->
    <target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH\:mm\:ss} | ${level:uppercase=true:padding=-5} | ${message}" />
    <!--    -->

    <target xsi:type="File"  name="ESDLog"
    fileName="${basedir}/logs/${shortdate}/${var:LogDir}/${date:format=yyyy-MM-dd HH}.log"
    layout ="${longdate} ${message}"/>
    
  </targets>

  <rules>
    <!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL-->
    <!--<logger name="*" minlevel="Trace" writeTo="debugger" />
    --><!--INFO,WARN,ERROR,FATAL--><!--
    <logger name="*" minlevel="Info" writeTo="db" />
    --><!--DEBUG,INFO,WARN,ERROR,FATAL--><!--
    <logger name="*" minlevel="Debug" writeTo="file" />--> 
 
    <logger name="ESDLog" minlevel="Info" writeTo="ESDLog"></logger>
  </rules>
</nlog>

3.写一个Logger类这里使用线程 以及线程锁。

using NLog;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Text;
using System.Threading;

namespace com.aaa.Util
{
    public class Logger
    {
        static readonly object locker = new object();
        NLog.Logger _logger;

        private Logger(NLog.Logger logger)
        {
            _logger = logger;
        }

        public Logger(string name) : this(LogManager.GetLogger(name))
        {

        }

        public static Logger Default { get; private set; }
        static Logger()
        {
            Default = new Logger(NLog.LogManager.GetCurrentClassLogger());
        }

        public static void WriteLog1(string name, string msg)
        {
            LogModels lm = new LogModels();
            lm.Name = name;
            lm.msg = msg;

            ParameterizedThreadStart tStart = new ParameterizedThreadStart(ThreadWriteLog);
            Thread thread = new Thread(tStart);
            thread.Start(lm);//传递参数 
        }

        public static void ThreadWriteLog(object arg)
        {
            lock (locker)
            {
                LogModels lm = (LogModels)arg;
                LogManager.Configuration.Variables["LogDir"] = lm.Name;
                Logger logger = new Logger("ESDLog");
                logger.Info(lm.msg);
            }
        }

        #region Debug
        public void Debug(string msg, params object[] args)
        {
            _logger.Debug(msg, args);
        }

        public void Debug(string msg, Exception err)
        {
            _logger.Debug(err, msg);
        }
        #endregion

        #region Info
        public void Info(string msg, params object[] args)
        {
            _logger.Info(msg, args);
        }

        public void Info(string msg, Exception err)
        {
            _logger.Info(err, msg);
        }
        #endregion
        #region Custom
        #endregion

    }

    public class MyLogEventInfo : LogEventInfo
    {
        public MyLogEventInfo() { }
        public MyLogEventInfo(LogLevel level, string loggerName, string message) : base(level, loggerName, message)
        { }

        public override string ToString()
        {
            //Message format
            //Log Event: Logger='XXX' Level=Info Message='XXX' SequenceID=5
            return FormattedMessage;
        }
    }

    public class LogModels
    {
        public string Name { set; get; }
        public string msg { set; get; }
    }


}

 4.C#中使用日志记录

  1.写入Exception目录              
catch (Exception ex)
   { 
     string msg = string.Format("Exception  ={0} }", ex.Message);
     Logger.WriteLog1("Exception",msg); 
   }

  2.写入Exception\abc目录 
 catch (Exception ex)
     { 
        string msg = string.Format("Exception  ={0} }", ex.Message);
        Logger.WriteLog1(@"Exception\abc",msg); 
     }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值