当前位置: 首页 > news >正文

【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>
  1. <targets async="true"><target name="networkLog" xsi:type="AsyncWrapper"> 是异步包装器,能显著提升日志记录性能,因为它会将日志写入操作放入后台队列,避免阻塞主应用程序线程
  2. fileName中的 ${event-properties:item=logName:default=default} 是 NLog 中传递自定义属性的一种非常简洁和优雅的方式,使用 WithProperty 方法可配置值。如设备名称想要在代码中传入就可以做如此改动:${machineName} → ​​${event-properties:item=machineName:default=UnknownPC},machineName 获取的是电脑的名称,可以给电脑重命名来修改
  3. layout 中 ${callsite} 用于在日志中记录输出日志语句的源代码位置信息。
  4. layout 中 skipFrames=1 是因为我日志增加了 LogHelper 类。通过设置 skipFrames=1,NLog 会在调用堆栈中再向上一层,从而正确指向您业务代码中调用 LogHelper.LogWithContext方法的那个位置
  5. rules 中 final="true":​​过滤掉特定来源的日志​​。当一条日志信息匹配到带有 final="true" 的规则后,NLog 将​​停止继续匹配和处理后续的任何规则​​
  6. ruleswriteTo="":意味着匹配的日志不会写入任何目标,相当于被“吞掉”

二、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:有问题随时交流,互相学习

http://www.dtcms.com/a/577880.html

相关文章:

  • 用通俗易懂 + Android 开发实战的方式,详细讲解 Kotlin Flow 中的 retryWhen 操作符
  • Android 四大组件——BroadcastReceiver(广播)
  • 好看的单页面网站模板免费下载百度知道怎么赚钱
  • HTTP与HTTPS的核心区别及加密流程全解析:从明文传输到安全通信的演进
  • 好大夫王建设在线个人网站第一推广网
  • QML学习笔记(五十三)QML与C++交互:数据转换——序列类型与 JavaScript 数组的转换
  • Spring AI Alibaba语音合成实战:从零开始实现文本转语音功能
  • 科技向善,让养老更有温度——智慧养老的痛点破局与趋势前瞻
  • flink开发遇到的问题
  • “IP 地址” 咋分类?用 “电话号码分区” 讲透 A/B/C 类地址​
  • 网站建站服务公司网站建设和续费
  • 北京朝阳双桥网站建设wordpress设置侧边栏
  • 极简后台框架
  • 基于 Python + OpenCV 的人脸识别系统开发实战
  • 智慧康养新篇章:七彩喜如何重塑老年生活的温度与尊严
  • 【生活】做面包-免揉软吐司制作教程
  • 优艾智合亮相中国 — 东盟青年和平对话会践行科技向善
  • 物联网技术助力成为雾霾治理的科技利器
  • 【轨物方案】轨物科技低压综保智慧运维方案:以AIoT重塑电气安全与能效新范式
  • 商丘做微信网站sqwyy深圳市设计网站公司
  • 【音视频】MP4文件格式
  • 旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
  • py day32 元组与os
  • 非接触式高效检测:基于XTOM蓝光3D扫描技术的3C电子零部件全尺寸快速测量方案
  • wordpress熊账号网站建立好如何做seo
  • 外贸网站怎样做推广南通网站定制哪家好
  • JSON转CSV批量转换工具:高效处理结构化数据
  • ubuntu 部署 gitlab docker服务
  • 使用VMware安装centos的详细流程(保姆级教程)
  • Xshell免密钥登录CentOS7教程