Easy-DotNET Easy-DotNET
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
npm
  • 简介
  • ORM

    • EFCore
    • Dapper
    • FreeSql
    • SqlSugar
  • 任务调度

    • Hangfire
    • Quartz
    • FluentScheduler
    • Coravel
    • Quartzmin
  • 日志

    • Serilog
    • NLog
      • NLog的优点
      • NLog的配置
        • NLog的基本配置
        • NLog的目标
        • NLog的过滤器
        • 方式1(利用name路由过滤)
        • 方式2.利用filters配置过滤
        • NLog的布局
        • NLog的日志事件属性
      • NLog的使用示例
        • 在ASP.NET Core中使用NLog
        • 在WPF中使用NLog
        • Prism中使用依赖注入模式使用nlog
        • 1.安装nuget:NLog.Extensions.Logging
        • 2.注册,app.xmal.cs文件
        • 3.依赖注入
        • 4.调用
        • 在Windows服务中使用NLog
      • 总结
    • Log4Net
    • Stackdriver
    • ExceptionLess
  • 身份认证与授权

    • IdentityServer4
    • Identity
    • JWTBearer
    • Auth0
    • OpenIddict
  • Swagger文档

    • Swagger
    • Swashbuckle
    • NSwag
    • ReDoc
  • 对象映射

    • AutoMapper
    • EmitMapper
    • AgileMapper
    • Mapster
  • 消息传递

    • MediatR
    • MassTransit
    • Rebus
    • NServiceBus
  • 熔断重试限流

    • Polly
    • Resilience4j
    • AkkaNET
  • 缓存

    • CsRedis
    • FreeRedis
    • EasyCaching
    • StackExchangeRedis
    • CacheCow
    • NCache
    • Memory
  • 注册发现

    • Consul
    • Nacos
    • Apollo
  • 网关

    • Ocelot
    • Kong
    • Traefik
    • Zuul
  • GraphQL

    • GraphQLPlatform
    • GraphQLdotnet
  • 更多

    • NodaTime
    • FluentAssertions
    • Humanizer
    • 爬虫-AngleSharp
    • 邮件-MailKit
  • NET微服务
  • 日志
一个大西瓜
2023-04-20
目录

NLog

开源地址

Github:https://github.com/NLog/NLog.Extensions.Logging (opens new window)

NLog是一个在.NET平台上使用的流行的日志记录库。它提供了可定制化的配置和灵活的日志记录规则,以便开发人员可以在应用程序中轻松地添加日志记录功能。

# NLog的优点

使用NLog日志库可以提供以下优点:

  1. 可配置:NLog允许开发人员根据需要配置日志记录规则,包括日志级别、日志格式、日志目标和日志事件过滤器。
  2. 灵活性:开发人员可以轻松地将NLog与多种应用程序和平台集成,包括ASP.NET、WPF和Windows服务等。
  3. 可扩展性:NLog支持多种扩展,包括目标(target)、过滤器(filter)、布局(layout)和日志事件属性(log event properties)。

# NLog的配置

# NLog的基本配置

以下是使用NLog进行基本配置的示例:


<nlog>
  <targets>
    <target name="console" type="Console" layout="${longdate} ${level} ${message}" />
    <target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="console" />
    <logger name="*" minlevel="Trace" writeTo="file" />
  </rules>
</nlog>

在上面的配置中,我们定义了两个目标(target),一个是将日志记录到控制台中,另一个是将日志记录到文件中。我们还定义了两条规则(rule),用于指定哪些日志应该写入哪个目标中。

# NLog的目标

NLog目标定义了应用程序日志记录的位置。以下是使用NLog定义目标的示例:


<targets>
  <target name="console" type="Console" layout="${longdate} ${level} ${message}" />
  <target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
  <target name="database" type="Database">
    <connectionString>Database=MyDb;Server=MyServer;User ID=MyUser;Password=MyPassword;</connectionString>
    <commandText>INSERT INTO Logs (Date, Level, Message) VALUES (@Date, @Level, @Message);</commandText>
    <parameter name="@Date" layout="${longdate}" />
    <parameter name="@Level" layout="${level}" />
    <parameter name="@Message" layout="${message}" />
  </target>
</targets>

在上面的配置中,我们定义了三个目标:

  1. 将日志记录到控制台中;

  2. 将日志记录到文件中;

  3. 将日志记录到数据库中。

# NLog的过滤器

NLog过滤器允许开发人员根据需要指定要记录的日志事件。

常用2种过滤方式:

方式1.利用name路由过滤

方式2.利用filters配置过滤

官网参考:https://github.com/nlog/nlog/wiki/Filtering-log-messages

# 方式1(利用name路由过滤)

name 名称(*代表多个字符,?代表一个字符)

    <logger name="WebApplog.Controllers.MyController"
         level="Info"
         writeTo="logb1" 
         final="true">
    </logger>
  
    <logger name="*.CommonServices"
        level="Info"
        writeTo="log_te"
        final="true">
    </logger>

demo(不同控制器输出不同日志文件)

    <!--  不同控制器,输出不同文件  如果匹配成功,就不再继续往下匹配 final="true" -->
    <logger name="WebApplog.Controllers.ValuesController"
     level="Info"
     writeTo="loga1" final="true">
    </logger>

    <logger name="WebApplog.Controllers.MyController"
         level="Info"
         writeTo="logb1" final="true">
    </logger>
    <target name="loga1"
        xsi:type="File"
        fileName="${basedir}\logs\${shortdate}a1.txt"
        layout="${longdate} ${level}  ${message}"     />

    <target name="logb1"
            xsi:type="File"
            fileName="${basedir}\logs\${shortdate}b1.txt"
            layout="${longdate} ${level}  ${message}"     />
# 方式2.利用filters配置过滤

参考:

https://github.com/nlog/nlog/wiki/Filtering-log-messages

https://github.com/nlog/nlog/wiki/When-filter

https://github.com/nlog/nlog/wiki/WhenContains-filter

demo1:

   <logger name="WebApplog.Controllers.*"
            level="Trace"
            writeTo="filemy1,filemyjson1">

      <!-- 
      defaultAction="Log" 就是默认写入 
      defaultAction="Ignore" 就是默认忽略,不写入
      参考:  https://github.com/nlog/nlog/wiki/When-filter  -->
      <filters defaultAction="Ignore">

        <!-- action="Ignore" 满足条件就忽略掉,不写日志
             action="Log"  满足条件就写日志
        -->
        <!--  因为消息中包含 orderinfo,所以下面2种判断方式都是可以的
        <when condition="contains(message, 'orderinfo')" action="Log" />
        <when condition="starts-with(message, 'orderinfo')" action="Log" />
        -->
        <when condition="starts-with(message, 'orderinfo')" action="Log" />
 
      </filters>

    </logger>

demo2:同一个文件的日志,用不同字符区分写到不同log

利用whenContains

    <!-- final="true" -->
    <logger name="*.CommonServices"
        level="Info"
        writeTo="log_BoardBindController"  >
 
      <filters  defaultAction="Ignore">
      
        <!--  
                
        <when condition="contains(message, 'spiapi.Controllers.BoardBindController')" action="Log" ></when>
        -->

        <!-- 
         whenContains 标识也可以过滤
         
             layout:比较对象 一般用 ${message}
             action="Ignore" 满足条件就忽略掉,不写日志
             action="Log"  满足条件就写日志
             substring 就是要匹配的字符串
             ignoreCase 忽略大小写 默认:False
             
         
             https://github.com/nlog/nlog/wiki/WhenContains-filter
        -->
        <whenContains layout="${message}"
                      substring="spiapi.Controllers.BoardBindController"
                      action="LogFinal"
                      ignoreCase="true"/>

      
      </filters>

    </logger>


    <!-- final="true" -->
    <logger name="*.CommonServices"
       level="Info"
       writeTo="log_BoardTakeController"  >
      <filters defaultAction="Ignore" >

        <!--
        <when condition="contains(message, 'spiapi.Controllers.BoardTakeController')" action="Log" ></when>  
        -->

        <whenContains layout="${message}"
                        substring="spiapi.Controllers.BoardTakeController"
                        action="LogFinal"
                        ignoreCase="true"/>

      </filters>

    </logger>

官网demo

        <!--  官网demo,留着参考
            <when condition="exception != null" action="Log" />
            <when condition="length(message) > 100" action="Ignore" />
            <when condition="'${OnHasProperties:1}' != ''" action="Ignore" />
            <when condition="logger == 'MyApps.SomeClass'" action="Ignore" />
            <when condition="(level >= LogLevel.Debug and contains(message, 'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
            <when condition="not starts-with(message, 'PleaseLogThis')" action="Ignore" />            
            -->

以下是使用NLog定义过滤器的示例:


<targets>
  <target name="console" type="Console" layout="${longdate} ${level} ${message}" />
  <target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
</targets>
<rules>
  <logger name="*" minlevel="Trace" writeTo="console" />
  <logger name="*" minlevel="Warn" writeTo="file">
    <filters>
      <when condition="'${message}' contains 'error'" action="Ignore" />
    </filters>
  </logger>
</rules>

在上面的配置中,我们定义了两个目标和两条规则。第二个规则包含一个过滤器,用于忽略包含“error”字样的日志事件。

# NLog的布局

NLog布局定义了日志事件的格式。以下是使用NLog定义布局的示例:


<targets>
  <target name="console" type="Console" layout="${longdate} ${level} ${message}" />
  <target name="file" type="File" fileName="logfile.txt" layout="${longdate} ${level} ${message}" />
</targets>
<rules>
  <logger name="*" minlevel="Trace" writeTo="console" />
  <logger name="*" minlevel="Trace" writeTo="file">
    <layout type="JsonLayout">
      <attribute name="time" layout="${longdate}" />
      <attribute name="level" layout="${level}" />
      <attribute name="message" layout="${message}" />
    </layout>
  </logger>
</rules>

在上面的配置中,我们定义了两个目标和两条规则。第二个规则包含了一个自定义的布局类型JsonLayout,用于将日志事件以JSON格式记录到文件中。

# NLog的日志事件属性

NLog日志事件属性允许开发人员将自定义属性添加到日志事件中。以下是使用NLog定义日志事件属性的示例:


var logger = LogManager.GetCurrentClassLogger();
logger.Info("Starting application {AppName}...", "My Application");

在上面的示例中,我们使用日志记录器(logger)对象的Info方法将一条带有自定义属性的日志事件记录到日志中。

# NLog的使用示例

# 在ASP.NET Core中使用NLog

要在ASP.NET Core中使用NLog,可以执行以下步骤:

  1. 将NLog.Web.AspNetCore包添加到项目中。
  2. 在Startup.cs文件中添加以下代码:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddNLog();
    app.AddNLogWeb();
    ...
}
  1. 在appsettings.json文件中添加以下代码:

"NLog": {
    "targets": {
        "logfile": {
            "type": "File",
            "fileName": "${basedir}/logs/${shortdate}.log",
            "layout": {
                "type": "JsonLayout",
                "includeAllProperties": true,
                "excludeProperties": "CallerMemberName,CallerFilePath,CallerLineNumber"
            }
        }
    },
    "rules": [
        {
            "logger": "*",
            "minLevel": "Info",
            "writeTo": "logfile"
        }
    ]
}

在上面的示例中,我们定义了一个名为logfile的目标,将日志记录到一个文件中,并使用JsonLayout格式化日志事件。我们还定义了一条规则,将所有级别为Info及以上的日志事件写入logfile目标中。

# 在WPF中使用NLog

要在WPF中使用NLog,可以执行以下步骤:

  1. 将NLog.Config和NLog.dll添加到项目中。
  2. 在App.xaml.cs文件中添加以下代码:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var logger = LogManager.GetCurrentClassLogger();
        logger.Info("Application started.");
    }

    protected override void OnExit(ExitEventArgs e)
    {
        base.OnExit(e);
        var logger = LogManager.GetCurrentClassLogger();
        logger.Info("Application exited.");
    }
}

在上面的示例中,我们使用日志记录器(logger)对象的Info方法记录应用程序的启动和退出事件。

# Prism中使用依赖注入模式使用nlog
# 1.安装nuget:NLog.Extensions.Logging
# 2.注册,app.xmal.cs文件
Microsoft.Extensions.Logging.ILogger logger;



protected override void RegisterTypes ( IContainerRegistry containerRegistry )
{
    
    var factory = new NLog.Extensions.Logging.NLogLoggerFactory();
    logger = factory.CreateLogger( "" );
    //下面这个是加载指定名字  nlog.config里面:    <logger name="mylognameabc" level="Info" writeTo="mylogfileabc"/>
    //Microsoft.Extensions.Logging.ILogger logger = factory.CreateLogger( "mylognameabc" );
    containerRegistry.RegisterInstance( logger );
        
}
# 3.依赖注入
IRegionManager _regionManager;
ILogger logger;


public LogWindowViewModel ( IRegionManager regionManager , ILogger logger )
{
    this._regionManager = regionManager;
    this.logger = logger;
}
# 4.调用
private DelegateCommand _AButtonClickCommand;
public DelegateCommand AButtonClickCommand => _AButtonClickCommand ?? ( _AButtonClickCommand = new DelegateCommand( () =>
{
    //导航 
    this._regionManager.RequestNavigate( "ContentRegion" , "AAAUC" );

    //写日志
    this.logger.LogInformation( "msg:主窗体写入" );
                
} ) );

# 在Windows服务中使用NLog

要在Windows服务中使用NLog,可以执行以下步骤:

  1. 将NLog.Config和NLog.dll添加到项目中。
  2. 在服务类中添加以下代码:

public partial class MyService : ServiceBase
{
    private readonly ILogger _logger;

    public MyService()
    {
        InitializeComponent();
        _logger = LogManager.GetCurrentClassLogger();
    }

    protected override void OnStart(string[] args)
    {
        _logger.Info("Service started.");
    }

    protected override void OnStop()
    {
        _logger.Info("Service stopped.");
    }
}

在上面的示例中,我们使用日志记录器(logger)对象的Info方法记录服务的启动和停止事件。

# 总结

NLog是一个功能强大的日志记录库,提供了可定制化的配置和灵活的日志记录规则。使用NLog,开发人员可以轻松地将日志记录功能集成到.NET应用程序中,并以多种方式记录日志事件,包括控制台、文件和数据库。使用示例中提到的几种场景,分别在ASP.NET Core、WPF和Windows服务中使用NLog,可以帮助开发人员更好地理解和使用NLog库。

上次更新: 2023/09/19, 19:55:10
Serilog
Log4Net

← Serilog Log4Net→

Theme by Vdoing | Copyright © 2019-2024 一个大西瓜 | MIT License | 苏ICP备2023013501号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式