C#日志使用
日志框架
框架选择:NLog
安装方法,Nuget命令行:Install-Package NLog
常用规则
- 尽量不要在循环中打印日志。
- 应输出错误的堆栈信息:
e.Message仅为异常描述,e.ToString()可以打印异常堆栈。 - 抛异常的地方不要打印日志,因为一般捕获异常的地方会打印,多次打印造成重复输出。
- 日志级别的使用要准确。
- 关键信息可以加显眼的符号,如程序启动时:
======= app start =======,方便快速定位信息。 - 不要使用
Console.WriteLine(),效率低。 - 日志的保持时间应在15天以上重要日志适当延长。
- 配置日志框架输出格式的内容不要包含类名、函数名、行号等信息,这种行为消耗巨大。
- 谨慎记录日志,避免输出大量无效日志、信息不全的日志。
- 日志函数的参数不要使用拼接字符串,使用格式化字符串。
应该打印什么日志
- 调试日志:开发阶段使用大量调试日志,方便调试,上线后禁止。
- 运行日志:记录程序的运行,该部分日志应能体现程序的运行流程。
- 状态日志:记录程序的状态,用于数据展示。
NLog功能简介
NLog使用
- 使用单独文件进行NLog配置,文件名命名为NLog.config
- 配置
autoReload="true":配置修改是否自动加载。 - 配置
throwExceptions="false":日志出现异常时是否需要抛出异常,若配置为true日志记录异常时由于没有捕获异常,会导致程序挂掉。 - 配置
internalLogLevel=Debug:表示nlog日志的执行日志记录等级,开发过程中配置为Debug,上线后配置为Info。 - 配置
internalLogFile:表示nlog日志的执行日志记录的位置。通过./XXXX的方式可以配置到程序的相对目录。日志一律保存到./Logs/日期/进程名.log - 日志级别使用范围规定为Debug-Error,只允许使用这四个级别的日志。开发过程中将日志等级设为Debug,上线后设置为Info。
- 配置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#日志使用的更多相关文章
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- Logstash实践: 分布式系统的日志监控
文/赵杰 2015.11.04 1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- 如何正确使用日志Log
title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- 文章首发地址:http ...
- 前端学HTTP之日志记录
前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...
- ASP.NET Core应用中如何记录和查看日志
日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...
- .NET Core的日志[5]:利用TraceSource写日志
从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...
- .NET Core的日志[4]:将日志写入EventLog
面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针对各种事件的日志,我们的应用 ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
随机推荐
- Java创建线程四种方式
1.继承Thread类 public class MyThread extends Thread { public MyThread() { } public void run() { for(int ...
- 【noi 2.6_1759】LIS 最长上升子序列(DP,3种解法)
题意我就不写了.解法有3种: 1.O(n^2).2重循环枚举 i 和 j,f[i]表示前 i 位必选 a[i] 的最长上升子序列长度,枚举a[j]为当前 LIS 中的前一个数. 1 #include& ...
- 2020 ICPC Asia Taipei-Hsinchu Regional Problem H Optimization for UltraNet (二分,最小生成树,dsu计数)
题意:给你一张图,要你去边,使其成为一个边数为\(n-1\)的树,同时要求树的最小边权最大,如果最小边权最大的情况有多种,那么要求总边权最小.求生成树后的所有简单路径上的最小边权和. 题解:刚开始想写 ...
- 洛谷-P1434 [SHOI2002]滑雪 (记忆化搜索)
题意:有一个\(R*C\)的矩阵,可以从矩阵中的任意一个数开始,每次都可以向上下左右选一个比当前位置小的数走,求走到\(1\)的最长路径长度. 题解:这题很明显看到就知道是dfs,但是直接爆搜会TLE ...
- CQRS Event Sourcing介绍
什么是CQRS模式? CQRS是Command and Query Responsibility Segregation的缩写,直译就是命令与查询责任分离的意思. 命令会改变对象的状态,但不返回任何数 ...
- 洛谷P1144-最短路计数-最短路变形
洛谷P1144-最短路计数 题目描述: 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 思路: \(Dijkstra ...
- Zabbix 监控网站
官网教学步骤 配置 Web 监控 创建 Web 场景 配置 Web 场景 配置 Web 监控步骤 一共划分为 5 个步骤: 监测访问登录页面 模拟登录功能 # sid 变量的值 regex:name= ...
- 网络安全-WEB基础,burpsuite,WEB漏洞
1. web基础 HTTP: GET POST REQUEST RESPONSE... JDK robots.txt 网页源代码/注释 目录扫描--御剑,dirmap 端口信息--nmap 备份文件- ...
- 2018牛客多校第一场 E-Removal【dp】
题目链接:戳这里 转自:戳这里 题意:长度为n的序列,删掉m个数字后有多少种不同的序列.n<=10^5,m<=10. 题解:dp[i][j]表示加入第i个数字后,总共删掉j个数字时,有多少 ...
- Linux 驱动框架---input子系统框架
前面从具体(Linux 驱动框架---input子系统)的工作过程学习了Linux的input子系统相关的架构知识,但是前面的学习比较实际缺少总结,所以今天就来总结一下输入子系统的架构分层,站到远处来 ...