本文参考链接

日志框架

框架选择:NLog

安装方法,Nuget命令行:Install-Package NLog

常用规则

  1. 尽量不要在循环中打印日志。
  2. 应输出错误的堆栈信息:e.Message仅为异常描述,e.ToString()可以打印异常堆栈。
  3. 抛异常的地方不要打印日志,因为一般捕获异常的地方会打印,多次打印造成重复输出。
  4. 日志级别的使用要准确。
  5. 关键信息可以加显眼的符号,如程序启动时:======= app start =======,方便快速定位信息。
  6. 不要使用Console.WriteLine(),效率低。
  7. 日志的保持时间应在15天以上重要日志适当延长。
  8. 配置日志框架输出格式的内容不要包含类名、函数名、行号等信息,这种行为消耗巨大。
  9. 谨慎记录日志,避免输出大量无效日志、信息不全的日志。
  10. 日志函数的参数不要使用拼接字符串,使用格式化字符串。

应该打印什么日志

  1. 调试日志:开发阶段使用大量调试日志,方便调试,上线后禁止。
  2. 运行日志:记录程序的运行,该部分日志应能体现程序的运行流程。
  3. 状态日志:记录程序的状态,用于数据展示。

NLog功能简介

NLog使用
  1. 使用单独文件进行NLog配置,文件名命名为NLog.config
  2. 配置autoReload="true":配置修改是否自动加载。
  3. 配置throwExceptions="false":日志出现异常时是否需要抛出异常,若配置为true日志记录异常时由于没有捕获异常,会导致程序挂掉。
  4. 配置internalLogLevel=Debug:表示nlog日志的执行日志记录等级,开发过程中配置为Debug,上线后配置为Info。
  5. 配置internalLogFile:表示nlog日志的执行日志记录的位置。通过./XXXX的方式可以配置到程序的相对目录。日志一律保存到./Logs/日期/进程名.log
  6. 日志级别使用范围规定为Debug-Error,只允许使用这四个级别的日志。开发过程中将日志等级设为Debug,上线后设置为Info。
  7. 配置targets的aasync=true:异步保存日志,从而防止日志影响业务性能。
日志等级
Level FirstCharacter Ordinal
Trace T 0
Debug D 1
Info I 2
Warn W 3
Error E 4
Fatal F 5
Off O 6

通过NLog.LogManager.GetLogger我们可以获取一个日志对象示例。传入的参数为日志实例名,我们可以在日志名中通过${logger}参数输出日志实例名。可以将不同的日志保存到不同的文件。

targets配置

NLog通过target配置日志输入的目标。可以通过配置多个target将日志输入到多个目录,多个目标(文件,网络,数据库等)。如通过设置2个目标,将info和error日志分开保存。其中很多参数是共用的,我们可以设置一个默认参数default-target-parameters,减少配置文件节点。

xsi:type:输入类型:

  • ColoredConsole : 使用可自定义的颜色将日志消息写入控制台。
  • Console - 将日志消息写入控制台。
  • Debug - 模拟目标-用于测试。
  • File - 将日志消息写入一个或多个文件。
  • Mail - 使用 smtp 协议或拾取文件夹通过电子邮件发送日志邮件。
  • Null - 丢弃日志消息。主要用于调试和基准测试。

name:目标的名字,可以通过创建Rule规则限制目标的输出。

filename:文件名,日志保存文件时可以保存到该文件中。文件名支持参数化,通过各种参数更方便的输出日志。

archiveFileName:为了防止日志文件保存的太大,我们将日志文件拆分保存。通过archiveFileName参数设置保存格式,具体格式可以到这里查看。

createDirs:若设置的日志文件夹不存在,则自动创建文件夹。

keepFileOpen:为了提高文件写入性能,避免每次写入文件都开关文件,将keepFileOpen设置为true,我们通过openFileCacheTimeout参数定时关闭文件。

autoFlush:为了提高日志写入性能,不必每次写入日志都直接写入到硬盘上,将autoFlush设置为false,我们通过openFileFlushTimeout参数定时写入文件。

openFileCacheTimeout:将keepFileOpen参数设置为false,则设置定时关闭日志。防止日志一直开着占用着。

openFileFlushTimeout:将autoFlush参数设置为false,则设置定时将日志从缓存写入到硬盘时间。

archiveAboveSize:为了防止一个文件日志太大,我们需要根据指定大小将日志拆文件保存。archiveAboveSize参数的单位是字节。通过设置为10240=10KB,每个日志大小达到10KB就会自动拆分文件,拆分后的文件名规则通过archiveFileName设置,拆分文件名的规则通过archiveNumbering设置,具体规则可以查看这里。

concurrentWrites:支持多个并发一起写文件,提高文件写入性能。

encoding: Nlog默认保存的编码格式为Encoding.Default,中文保存到日志中会出现乱码,将其设置为utf-8,就可以正常保存了。

layout:表示输出的格式,若为最简单的内容输入,则直接通过参数设置输入格式即可。除了最简单的文本格式还支持以下四种类型的数据,通过xsi:type参数设置layout的格式,如xsi:type="JsonLayout"

  • CSV - A specialized layout that renders CSV-formatted events.
  • Compound - A layout containing one or more nested layouts.
  • Log4JXml - A specialized layout that renders Log4j-compatible XML events.
  • JSON - A specialized layout that renders to JSON. Json格式保存我们需要在layout节点下增加attribute来增加字段。
rules配置

我们可以创建一系列规则约束输出的内容。方法是在NLog节点下添加rules节点,rules节点下可以添加多个logger节点,每个logger节点为一条约束。

<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
  • name:logger名称,若为'*',则表示用于所有日志。
  • minlevel:表示当前约束的最小等级,只有等于或大于该值的日志等级才会被记录。
  • writeTo:表示当前规则约束那个target。

C#日志使用的更多相关文章

  1. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. Logstash实践: 分布式系统的日志监控

    文/赵杰 2015.11.04 1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及 ...

  4. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  5. 如何正确使用日志Log

    title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- 文章首发地址:http ...

  6. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  7. ASP.NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...

  8. .NET Core的日志[5]:利用TraceSource写日志

    从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...

  9. .NET Core的日志[4]:将日志写入EventLog

    面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针对各种事件的日志,我们的应用 ...

  10. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

随机推荐

  1. JVM探究——转载

    JVM探究 请你谈谈你对JVM的理解 Java8虚拟机和之前的变化更新 什么式OOM,什么是栈溢出StackOverFlowError?怎么分析 JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分 ...

  2. 自定义 ocelot 中间件输出自定义错误信息

    自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...

  3. Codeforces Global Round 9 B. Neighbor Grid

    题目链接:https://codeforces.com/contest/1375/problem/B 题意 给出一个 $n \times m$ 的方阵,每个方格中有一个非负整数,一个好方格定义如下: ...

  4. Leetcode(19)-删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  5. 数据分析常用库(numpy,pandas,matplotlib,scipy)

    概述 numpy numpy(numeric python)是 python 的一个开源数值计算库,主要用于数组和矩阵计算.底层是 C 语言,运行效率远高于纯 python 代码.numpy主要包含2 ...

  6. 2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解

    题意: 传送门 已知\(F(n)=3F(n-1)+2F(n-2) \mod 998244353,F(0)=0,F(1)=1\),给出初始的\(n_1\)和询问次数\(q\),设每一次的答案\(a_i= ...

  7. python文件持久化存储

    文件持久化存储 目录 文件持久化存储 脑图 文件的操作 with 语句 OS模块 json模块 存储为Excel文件 脑图 文件的操作 import os import platform # 1. 获 ...

  8. webpack 5 模块联合

    webpack 5 模块联合 webpack 5 https://webpack.docschina.org/concepts/module-federation/ https://github.co ...

  9. Dart DevTools & Flutter

    Dart DevTools & Flutter https://flutter.dev/docs/development/tools/devtools/overview https://dar ...

  10. qt 取进程列表,读写内存, 写字节集

    导入库 pro win32:LIBS += -lpsapi win32:LIBS += -lkernel32 获取列表 #include "mainwindow.h" #inclu ...