安装包
使用NLog
Microsoft.Extensions.Logging是netcore框架自带的日志组件扩展
NLog.Extensions.Logging 就是Nlog包的扩展包,这个帮助我们快速的将NLog注入到IOC容器中
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logconfig =>
{
logconfig.ClearProviders();//这玩意的作用就是清除微软官方的日志,明显效果就是运行项目控制台什么都没有
logconfig.AddNLog();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
或者
internal class Program
{
static void Main(string[] args)
{
ServiceCollection sc=new ServiceCollection();
sc.AddLogging(logBuilder =>
{
logBuilder.AddConsole();
logBuilder.ClearProviders();
logBuilder.AddNLog();
});
sc.AddScoped<Test>();
var sp = sc.BuildServiceProvider();
Test test = sp.GetRequiredService<Test>();
test.logTest();
}
}
public class Test
{
private ILogger<Test> log;
public Test(ILogger<Test> log)
{
this.log = log;
}
public void logTest()
{
log.LogDebug("Debug:开始调试");
log.LogInformation("info:默认日志");
log.LogWarning("warn:警告日志");
log.LogError("Error:错误日志");
}
}
nlog.config详细配置
在项目目录下创建一个文件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"
throwConfigExceptions="true"
internalLogLevel="info"
internalLogFile="E:\log\ISP\internal-nlog.txt">
<targets>
<target xsi:type="File" name="allfile" fileName="E:\log\ISP\nlog-all-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
<target xsi:type="File" name="ownFile-web" fileName="E:\log\ISP\nlog-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="allfile" />
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>
nlog根节点里面包含了最常用的子节点 targets和 rules
关于nlog节点的属性说明:
autoReload
:修改配置文件后是否允许自动加载无须重启程序throwConfigExceptions
:内部日志系统抛出异常internalLogLevel
:可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭internalLogFile
:把内部的调试和异常信息都写入指定文件里
建议throwConfigExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。
targets定义了日志的目标或者说输出 ,在这里可以按需设置文件名称和格式,输出方式。
可以在targets节点里面写多个target节点。每个target节点代表一种输出方式,输出到控制台,输出到文本,输出到数据库等等。
甚至同一个输出目标,都是输出到文本,输出格式也可以大不相同。
target File属性
<target xsi:type="File"
name="String"
layout="Layout"
header="Layout"
footer="Layout"
encoding="Encoding"
lineEnding="Enum"
archiveAboveSize="Long"
maxArchiveFiles="Integer"
maxArchiveDays="Integer"
archiveFileName="Layout"
archiveNumbering="Enum"
archiveDateFormat="String"
archiveEvery="Enum"
archiveOldFileOnStartup="Boolean"
archiveOldFileOnStartupAboveSize="Long"
replaceFileContentsOnEachWrite="Boolean"
fileAttributes="Enum"
fileName="Layout"
deleteOldFileOnStartup="Boolean"
enableFileDelete="Boolean"
createDirs="Boolean"
concurrentWrites="Boolean"
openFileFlushTimeout="Integer"
openFileCacheTimeout="Integer"
openFileCacheSize="Integer"
networkWrites="Boolean"
concurrentWriteAttemptDelay="Integer"
concurrentWriteAttempts="Integer"
bufferSize="Integer"
autoFlush="Boolean"
keepFileOpen="Boolean"
forceManaged="Boolean"
enableArchiveFileCompression="Boolean"
cleanupFileName="Boolean"
writeFooterOnArchivingOnly="Boolean"
writeBom="Boolean" />
:::success
name:输出配置名称,可以自己定义,随便写,供rules使用
layout:日志的格式模板 自定义,里面的变量可以参考官方文档,本文末尾也有参考
header:头部格式
footer:脚部格式
encoding:编码格式,可以是utf-8或者其他字符集
lineEnding:行结束模式
- CR:在每行后插入 CR 字符 (ASCII 13)。
- CRLF:在每行之后插入 CR LF 序列(ASCII 13、ASCII 10)
- Default:在每行之后插入依赖于平台的行尾序列。
- LF:在每行后插入 LF 字符 (ASCII 10)。
- None:不插入任何行尾。
这个是官方给的解释及参考值
archiveAboveSize:以字节为单位的大小,超过该大小的日志文件将被自动存档
maxArchiveFiles:应保留的最大存档文件数。如果maxArchiveFiles小于或等于 0,则不删除旧文件
maxArchiveDays: 应保留的存档文件的最长期限。当archiveNumbering为时无效Rolling。如果maxArchiveDays小于或等于 0,则不删除旧文件
archiveFileName:要用于存档的文件的名称 可以指定日志,具体参考官方文档
archiveNumbering:对文件档案进行编号的方式
archiveDateFormat:指定用于存档编号的日期格式。此选项仅在“ArchiveNumbering”参数设置为 Date 或 DateAndSequence 时有效
- Default: yyyyMMdd
- Default when ArchiveEvery = Minute: yyyyMMddHHmm
- Default when ArchiveEvery = Hour: yyyyMMddHH
- Default when ArchiveEvery = Month: yyyyMM
- Default when ArchiveEvery = Year: yyyy
archiveEvery:指示是否在每次经过指定时间时自动归档日志文件
- Day - 每天存档。
- Hour - 每小时存档一次。
- Minute - 每分钟存档一次。
- Month - 每月存档。
- None - 不要根据时间存档。
- Year - 每年存档。
- Sunday- 每个星期日存档。在 NLog 4.4.4 中引入。
- Monday - 每周一存档。在 NLog 4.4.4 中引入。
- Tuesday - 每个星期二存档。在 NLog 4.4.4 中引入。
- Wednesday- 每周三存档。在 NLog 4.4.4 中引入。
- Thursday - 每个星期四存档。在 NLog 4.4.4 中引入。
- Friday - 每星期五存档。在 NLog 4.4.4 中引入。
- Saturday - 每星期六存档。在 NLog 4.4.4 中引入。
如果当前时间段发生变化,文件将作为写入操作的一部分移动到存档中。例如,如果当前小时从 10 点更改为 11 点,则在 11:00 或之后发生的第一次写入将触发
archiveOldFileOnStartup:在启动时存档旧日志文件
archiveOldFileOnStartupAboveSize:启动时存档旧日志文件的文件大小阈值。默认值为 0,这意味着一旦启用archiveOldFileOnStartup就会归档文件。在 NLog 4.7 中引入
replaceFileContentsOnEachWrite:指示是否在每次写入时替换文件内容,而不是在末尾附加日志消息
fileAttributes:文件属性(仅限 Windows)
- Archive:文件应该被存档。
Compressed:由于 .Net 限制,压缩将不起作用。您可以使用 enableArchiveFileCompression。- DeleteOnClose:关闭文件后删除文件。
- Device:设备文件。
- Encrypted:加密文件。
- Hidden:隐藏文件。
- NoBuffering:系统打开一个没有系统缓存的文件。
- Normal:普通文件。
- NotContentIndexed:内容索引服务不应为文件编制索引。
- PosixSemantics:根据 POSIX 规则访问文件。
- Readonly:只读
- ReadOnly:只读文件。
- ReparsePoint:重新解析点。
- SparseFile:稀疏文件。
- System:系统文件。
- Temporary:文件是临时的(应该保存在缓存中,如果可能的话不要写入磁盘)。
- WriteThrough:系统通过任何中间缓存写入并直接进入磁盘。
fileName:要写入的文件的名称
deleteOldFileOnStartup: 指示是否在启动时删除旧日志文件,此选项仅在“FileName”参数表示单个文件时有效。
enableFileDelete:指示是否启用删除日志文件
createDirs:是否创建不存在的目录
keepFileOpen:指示是否在每次记录事件时保持日志文件打开,将此属性更改为 true 将大大提高性能,但也会保持文件句柄锁定。启用此选项时,请考虑设置openFileCacheTimeout = 30,因为它将允许存档操作并对被删除的日志文件做出反应。
concurrentWrites:当使用keepFileOpen = true时,支持从同一机器主机上的多个进程优化并发写入同一日志文件。通过使用一种特殊的技术,它可以让文件从多个进程中打开。如果只有单个进程(和单个 AppDomain)应用程序正在记录日志,那么设置为concurrentWrites = False会更快。
openFileCacheTimeout:文件保持打开的最大秒数。如果此数字为负数,则文件在一段时间不活动后不会自动关闭
openFileCacheSize:要保持打开的文件数。在单个 File 目标写入多个文件(例如按级别或按记录器拆分)的情况下,将此设置为更高的值可能会提高性能
openFileFlushTimeout:显式刷新文件缓冲区之间的秒数。有助于确保文件缓冲区在autoFlush = false时最终被刷新
networkWrites:指示是否由不同网络主机上的多个进程并发写入日志文件。
concurrentWriteAttemptDelay:在尝试再次写入文件之前等待的延迟(以毫秒为单位)。整数默认值:1
实际延迟是一个介于 0 和此参数中指定的值之间的随机值。在每次失败的尝试中,延迟基数加倍为 ConcurrentWriteAttempts 次。
concurrentWriteAttempts:在 NLog 丢弃日志消息之前尝试写入文件的次数
bufferSize:以字节为单位的日志文件缓冲区大小。整数默认值:32768
autoFlush: 指示是否在每条日志消息后自动刷新文件缓冲区,禁用它会提高性能
forceManaged:指示文件目标应仅使用托管方法。这会禁用某些选项
enableArchiveFileCompression:指示是否将存档文件压缩为 zip 文件
cleanupFileName:在写入文件之前,检查文件名是否包含非法字符(取决于操作系统)。如果写入大量消息,这可能代价高昂。清理缓存为固定名称(无布局渲染器)。将此设置false为最佳性能(但要注意文件名,如果错误,则不会写入任何内容)
writeFooterOnArchivingOnly:指示是否应仅在归档文件时写入页脚
writeBom:指示是否在创建的文件中写入 BOM(字节顺序标记)
:::
rules里面的的子节点logger
name:记录者的名字(名称空间+类型)就是那个类记录的这个日志,*全局匹配,就是都可以,都记录 writeTo:规则匹配时日志应该被写入的一系列target,和target节点的name对应,由逗号分隔。 minlevel:最低级别 maxlevel:最高级别 level:单一日志级别 levels:一系列日志级别,由逗号分隔。
<logger name="*" minlevel="Trace" writeTo="allfile" />
layout属性表附录
${activityid} | 将其置入日志System.Diagnostics trace |
---|---|
${all-event-properties} | 事件日志上下文 |
${appdomain} | 当前应用程序域 |
${assembly-version} | 应用程序 |
${basedir} | 应用程序域的基本目录。 |
${callsite} | (类名称、方法名称和相关信息的源信息)。 |
${callsite-linenumber} | 调用类的 |
${counter} | 数值 |
${date} | 当前日期和时间。 |
${document-uri} | 用于Silverlight应用。 |
${environment} | 环境变量 |
${event-properties} | |
${exception} | exception信息 |
${file-contents} | 显示指定文件的内容 |
${gc} | 垃圾收集器 |
${gdc} | 诊断上下文 |
${guid} | GUID |
${identity} | 线程标识信息 |
${install-context} | 安装参数 |
${level} | 级别。 |
${literal} | |
${log4jxmlevent} | XML事件描述 |
${logger} | 记录器的名字 |
${longdate} | 日期和时间的格式分类yyyy-MM-dd HH:mm:ss.ffff。 |
${machinename} | 名称 |
${mdc} | 映射诊断 |
${mdlc} | 异步映射诊断上下文 |
${message} | 消息,就是写日志调用方法传的那个字符串,自定义 |
${ndc} | 线程结构 |
${ndlc} | 异步线程 |
${newline} | 文字换行 |
${nlogdir} | nlog.dll目录。 |
${performancecounter} | 述性能计数器。 |
${processid} | 当前进程标识符 |
${processinfo} | 运行信息 |
${processname} | 当前进程的名称。 |
${processtime} | 该时间过程中格式HH:MM:ss.mmm。 |
${qpc} | 高精度定时器,基于返回的值从queryperformancecounter(任选地)转换为秒。 |
${registry} | 从注册表中的值。 |
${sequenceid} | ID |
${shortdate} | 短时间 格式YYYY-MM-DD。 |
${sl-appinfo} | Silverlight应用。 |
${specialfolder} | 文件夹路径 |
${stacktrace} | 堆栈跟踪渲染器。 |
${tempdir} | 临时目录中。 |
${threadid} | 当前线程的标识符。 |
${threadname} | 当前线程。 |
${ticks} | 当前日期和时间。 |
${time} | 24小时格式HH:MM:ss.mmm。 |
${var} | 提供新的变量(4.1) |
${windows-identity} | windows线程标识信息(用户名) |