在.NET中使用NLog组件
.NET中,控制台程序、Winform、WPF使用NLog的方式相同,本文通过.NET5控制台程序说明如何使用NLog组件。
1、引用NLog组件
下面2种方法都可以引用NLog组件:
(1) 通过NuGet安装NLog包。
(2) 直接引用相应版本的NLog.dll。
2、NLog配置
在项目中添加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" keepVariablesOnReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="log/nlog.txt"> <!-- the targets to write to --> <targets async="true"> <!-- File Target for all log messages with basic details --> <!-- enableFileDelete: 是否允许删除日志文件。其取值类型为Boolean,默认为true。 maxArchiveFiles: 保存的最大存档文件数。其类型类Integer,默认为9个。 archiveNumbering: 存档文件的编号方式。 可选值: Rolling – 滚动式编号,即最新的日志文件编号为0,然后是1,… ,N。 Sequence – 序列式编号,即最大编号的日志文件为最新的日志文件。 archiveAboveSize: 存档上限值。当日志文件大于此值是,将自动存档。其类型为Long。 注意:在多进程并发记录日志的情况下,启用该选项可能会大幅降低日志记录速度。 在单进程时,为了达到最佳性能,可以考虑设置ConcurrentWrites为false。 bufferSize: 日志文件缓存区大小(单位:字节)。其取值类型为Integer,默认值为32768(32KB)。 deleteOldFileOnStartUp: 启动时,是否删除旧的日志文件。其取值类型为Boolean,默认为false。 concurrentWriteAttemptDelay: 在再次尝试将日志写入文件之前延迟的毫秒数。其取值类型为Integer,默认值为1。 备注:实际的延迟时间,是一个介于0到指定参数值之间的随机整数,且在每次尝试失败之后,都会将此参数加倍。 假使此参数值为10,则第一次重试写入的延迟时间(毫秒数)在 0-10之间的一个随机数, 第二次重试时为0-20之间的一个随机数,第三次重试时为0-40之间的一个随机数, 第四次重试时为0-80之间的一个随机数等等,以此类推。 keepFileOpen: 是否保持日志文件处于打开状态,以代替其在每次日志写事件发生时频繁打开和关闭。 其取值类型为Boolean,默认值为false。 备注:设置此属性为true,有助于提高性能。 openFileCacheTimeout: 文件保持打开状态的最大时间秒数。如果这个数字为负数,则在一定不活动时间后, 文件不会自动关闭。其取值类型为Integer,默认值为-1。(即默 认状态下文件始终处于打开状态以备写入。) autoFlush: 在每次日志信息后,是否自动刷新文件缓存区。其取值类型为Boolean,默认值为true。 createDirs: 是否允许自动创建(不存在的)目录。其取值类型为Boolean,默认为true。 encoding: 文件编码方式。 archiveFileName: 存档文件名称。允许使用Layout。 --> <target xsi:type="File" name="allfile" fileName="${basedir}/logs/log.txt" enableFileDelete="true" maxArchiveFiles="20" concurrentWrites="true" archiveNumbering="Sequence" archiveAboveSize="2097152" bufferSize="327680" deleteOldFileOnStartup="false" concurrentWriteAttemptDelay="10" keepFileOpen="true" openFileCacheTimeout="30" autoFlush="false" openFileFlushTimeout="30" createDirs="true" encoding="utf-8" enableArchiveFileCompression="true" archiveFileName="${basedir}/archivelogs/log${date:format=yyyy\-MM\-dd_HH\-mm\-ss}.zip" layout="[${counter}] ${longdate} [${level}] [${processid}] [${processname}] ${message} ${newline} ${stacktrace}"/> </targets> <!-- rules to map from logger name to target --> <rules> <logger name="*" minlevel="Debug" writeTo="allfile"/> </rules> </nlog>
3、NLog封装
public static class LogHelper { //NLog日志对象 private static Logger _logger; /// <summary> /// 初始化日志组件 /// </summary> /// <param name="configFile">NLog日志配置文件</param> public static void Startup(string configFile) { if (string.IsNullOrWhiteSpace(configFile)) { throw new ArgumentException(@"NLog ConfigFile is null or whitespace"); } try { _logger = LogManager.LoadConfiguration(configFile).GetCurrentClassLogger(); } catch (Exception e) { Console.WriteLine($@"NLog LoadConfiguration Exception: {e.Message}."); } } /// <summary> /// 关闭日志组件 /// </summary> public static void Shutdown() { _logger = null; LogManager.Shutdown(); } public static void Trace(object value) { _logger?.Trace(value); } public static void Debug(object value) { _logger?.Debug(value); } public static void Info(object value) { _logger?.Info(value); } public static void Warn(object value) { _logger?.Warn(value); } public static void Error(object value) { _logger?.Error(value); } public static void Fatal(object value) { _logger?.Fatal(value); } }
4、NLog使用
static void Main() { //启动日志组件 var directoryInfo = new DirectoryInfo(Assembly.GetExecutingAssembly().Location); var configFile = Path.Combine(directoryInfo.Parent?.FullName ?? string.Empty, "NLog.config"); LogHelper.Startup(configFile); LogHelper.Trace("trace"); LogHelper.Debug("debug"); LogHelper.Info("info"); LogHelper.Warn("warn"); LogHelper.Error("error"); LogHelper.Fatal("fatal"); //关闭日志组件 LogHelper.Shutdown(); }