【C#】NLog配置同时写入网络共享路径与本地路径日志
所有文章都是免费查看的,如果有无法查看的情况,烦请联系我修改哈~
前言少叙,直奔主题吧:
一、配置文件
<?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" ><variable name="appName" value="ConsoleAppDemo"/><targets async="true"><target name="LogFile"xsi:type="File"fileName="${basedir}/logs/${date:format=yyyy}/${date:format=MM}/${event-properties:item=logName:default=default}_${level}_${shortdate}.log"layout="${longdate} [${uppercase:${level}}] ${callsite:className=True:fileName=True:includeSourcePath=False:skipFrames=1} - ${message} ${exception:format=ToString}"maxArchiveDays="100"maxArchiveFiles="100"archiveAboveSize="102400000"createDirs="true"encoding="UTF-8"keepFileOpen="false" /><target name="NetworkLog" xsi:type="AsyncWrapper"><target xsi:type="File"fileName="//192.168.X.XXX/Share/logs/${machineName}/${date:format=yyyy}/${date:format=MM}/${event-properties:item=logName:default=default}_${level}_${shortdate}.log"layout="${longdate} [${machineName}] [${uppercase:${level}}] ${callsite:className=True:fileName=True:includeSourcePath=False:skipFrames=1} - ${message} ${exception:format=ToString}"maxArchiveDays="100"maxArchiveFiles="100"archiveAboveSize="102400000"createDirs="true"encoding="UTF-8"keepFileOpen="false"networkWrites="true"concurrentWrites="true" /></target></targets><rules><logger name="NetworkLog" minlevel="Debug" writeTo="LogFile,NetworkLog" final="true" /><logger name="*" minlevel="Debug" writeTo="LogFile" /></rules>
</nlog>- <targets async="true"> 与 <target name="networkLog" xsi:type="AsyncWrapper"> 是异步包装器,能显著提升日志记录性能,因为它会将日志写入操作放入后台队列,避免阻塞主应用程序线程
- fileName中的 ${event-properties:item=logName:default=default} 是 NLog 中传递自定义属性的一种非常简洁和优雅的方式,使用 WithProperty 方法可配置值。如设备名称想要在代码中传入就可以做如此改动:${machineName} → ${event-properties:item=machineName:default=UnknownPC},machineName 获取的是电脑的名称,可以给电脑重命名来修改
- layout 中 ${callsite} 用于在日志中记录输出日志语句的源代码位置信息。
- layout 中 skipFrames=1 是因为我日志增加了 LogHelper 类。通过设置 skipFrames=1,NLog 会在调用堆栈中再向上一层,从而正确指向您业务代码中调用 LogHelper.LogWithContext方法的那个位置
- rules 中 final="true":过滤掉特定来源的日志。当一条日志信息匹配到带有 final="true" 的规则后,NLog 将停止继续匹配和处理后续的任何规则
- rules 中 writeTo="":意味着匹配的日志不会写入任何目标,相当于被“吞掉”
二、LogHelper类
public class LogHelper
{private static readonly Logger Logger = LogManager.GetLogger("LogFile");private static readonly Logger NetWorkLogger = LogManager.GetLogger("NetworkLog");public static void Log(string msg, LogEnum logType = LogEnum.Info, string name = "执行"){var logger = TraditionalLogger.WithProperty("logName", name);switch (logType){case LogEnum.Fatal:logger.Fatal(msg);break;case LogEnum.Error:logger.Error(msg);break;case LogEnum.Warn:logger.Warn(msg);break;case LogEnum.Info:logger.Info(msg);break;case LogEnum.Debug:logger.Debug(msg);break;case LogEnum.Trace:default:logger.Trace(msg);break;}}public static void NetLog(string msg, LogEnum logType = LogEnum.Info, string name = "执行"){var logger = NetWorkLogger.WithProperty("logName", name);// var logger = NetWorkLogger.WithProperty("logName", name).WithProperty("machineName", "传入的设备名称");switch (logType){case LogEnum.Fatal:logger.Fatal(msg);break;case LogEnum.Error:logger.Error(msg);break;case LogEnum.Warn:logger.Warn(msg);break;case LogEnum.Info:logger.Info(msg);break;case LogEnum.Debug:logger.Debug(msg);break;case LogEnum.Trace:default:logger.Trace(msg);break;}}
}public enum LogEnum
{/// <summary>/// 记录信息/// </summary>Trace,/// <summary>/// 调试信息/// </summary>Debug,/// <summary>/// 消息信息/// </summary>Info,/// <summary>/// 警告信息/// </summary>Warn,/// <summary>/// 错误信息/// </summary>Error,/// <summary>/// 致命异常信息/// </summary>Fatal
}1. 根据 ${machineName} → ${event-properties:item=machineName:default=UnknownPC} 的改动已注释,如若使用自行替换。
PS:有问题随时交流,互相学习
