.NET6.0的日志组件Log4net

2023-11-20

前言:不允许让没有任何日志监控的项目上线,所以说真正开发起来必须要有监控,相当于多一双眼睛帮着我们看项目在运行时会不会有什么问题,我们要不断的在每个环节写日志,这样发生异常我们可以快速知道哪里有问题了,就可以快速解决。

目录

一、Log4net介绍

二、Log4net日志级别

三、Log4net写文本日志

四、Log4net日志写SqlServer


一、Log4net介绍

       Log4net是一个开源日志记录组件。是.Net下一个非常优秀的开源日志记录组件。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。通过它可以将.Net应用程序的日志记录到多种介质之中,包括:文件、控制台、window事物日志和数据库中,并且我们还可以设置和标示日志的级别等。和其它大多开源组件一样,Log4net也是从Java项目过度而来。Log4net来源于java应用中的Log4J。

二、Log4net日志级别

       日志的本质就是我们整个系统里面当前运行的一个状况,那么日志级别根据它的控制级别一共从低到高分为了:ALL→DEBUG→INFO→WARN→ERROR→FATAL→OFF,那这些级别都代表什么呢?DEBUG就是调试状态,INFO相当于平常的危险程度,WARN有一些危险,ERROR就是系统有异常了,FATAL就是非常严重了,可能系统已经崩了,我们在配置的时候可以去过滤一些级别。

三、Log4net写文本日志

1、我们要在我们的项目上右键点击管理NuGet程序包

2、在搜索框搜索Log4net进行安装

安装好了之后我们就会发现在项目目录里的依赖包下多了个log4net,但是现在还不够,我们得去搭配配置文件去使用

 3、可以去官网下载配置文件,也可以复制下面代码为Log4net.config文件,把这个文件复制进项目目录,配置文件右键属性选择设置为始终复制,因为我们最终这个配置文件要用到我们项目的运行目录下的。Apache log4net – Apache log4net: Config Example - Apache log4net

<?xml version="1.0" encoding="utf-8" ?> 
 <log4net>
    <!-- Define some output appenders -->
   
    <!--Type 表示用那种类型记录日志-->
    <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <!--表示用文本来记录日志-->
      
      <file value="log\log.txt" />
      <!--<file value="D:\MyLog1\Onelog.txt" />-->

      <!--追加日志内容-->
      <!--<appendToFile value="false" />-->
      <appendToFile value="true" />

      <!--防止多线程时不能写Log,官方说线程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--最小锁-->

      <!--配置Unicode编码-->
       <Encoding value="UTF-8" />

      <!--是否只写到一个文件里-->
      <param name="StaticLogFileName" value="false" />
       
      <!--当备份文件时,为文件名加的后缀,这里可以作为每一天的日志分别存储不同的文件-->
      <datePattern value="yyyyMMdd&quot;.txt&quot;" />
       
      <!--可以为:Once|Size|Date|Composite-->
      <!--Composite为Size和Date的组合-->
      <!--<rollingStyle value="Composite" />-->
      <rollingStyle value="Size" />
       
      <!--日志最大个数,都是最新的-->
      <!--rollingStyle节点为Size时,只能有value个日志文件-->
      <!--rollingStyle节点为Composite时,每天有value个日志-->
      <maxSizeRollBackups value="2" />

      <!--可用的单位:KB|MB|GB-->
      <maximumFileSize value="2MB" />

      <!--置为true,当前最新日志文件名永远为file节中的名字-->
      <staticLogFileName value="true" />

      <!--过滤器-->

      <!--阻止所有事件被记录-->
      <!--<filter type="log4net.Filter.DenyAllFilter"> </filter>-->

      <!--只有指定等级的日志事件才被记录-->
      <!--<filter type="log4net.Filter.LevelMatchFilter">
        <param value="FATAL" />
      </filter>-->
 
      <!--日志等级在指定范围内的事件才被记录-->
      <!--<filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="FATAL" />
      </filter>-->

  
      <layout type="log4net.Layout.PatternLayout">
        <!--日志输出格式:时间  日志类型  日志内容-->
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>

    <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
    <root>
      <priority value="ALL"/>
      <level value="ALL"/>
      <appender-ref ref="rollingAppender" />
    </root>
  </log4net>

4、接下来我们就要读取Log4net里面的相关配置,然后支持他的一个使用。其实我们可以直接基于这个builder,这个builder其实就是WebApplicationBuilder,本身它这里就是有日志的

我们可以看到AddLog4Net()是失效的(正常下载了一个程序集这里应该有红线,我为了方便两个一起都下载了)

于是我们再次从NuGet引入Microsoft.Extensions.Logging.Log4Net.AspNetCore,下载安装后红线就没有了,就生效了,就和上面的图片一样了。

 5、要是我们把Log4Net文件放到项目目录下的话,就能默认读取。但是你要是把它放在文件夹里头,就得在后面写上路径。

 6、配置完成之后咱们可以去新建一个控制器和视图看看咱们是不是配置成功了,在新建的控制器里构造一个函数,输入测验代码,并运行。输入视图文件地址,按回车。然后打开我们的项目根目录在bin/debug/net6.0目录下可以看到log文件夹,里面有个log.txt文件,打开就可以看到我们写的东西。

 

 总结一下Log4net的文本文件配置过程

(1)Nuget引入程序包

(2)准备好配置文件

(3)配置读取配置文件生效

(4)注入得到Log4net实例开始写日志

四、Log4net日志写SqlServer

        Log4net日志不光可以写SqlServer,还可以写MySQL、Oracle数据库等等,那么我们下面就看一看Log4net日志是怎么去写SqlServer日志的。

1、第一步还是去NuGet里面去下载安装一下程序集

 2、程序集引入进来之后,我们就要去修改配置文件,让它支持写数据库,打开我们的配置文件,就可以看到有这么一行节点代码,这行节点代码就代表着我们使用的是哪种类型记录日志的写法,比如我是写数据库类型的呢?还是写文本日志类型的呢?就看这个节点。

 然后我们把SqlServer的相关配置代码引用进来,还是可以去官网下载,我把官网的这一部分追加配置放到下面了,直接复制进去也是可以的。

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>

粘贴好之后我们就发现代码里红框区域和我们刚才下载的程序集一样,这个就是数据库驱动程序,这就是我们刚才为什么要下载程序集的原因。

 3、我们需要在root里加入支持数据库写日志的规则,其实到目前为止,Log4net已经同时支持文本和数据库写日志了打开SqlServer,要是没有可以去官网下个免费版,然后找教程安装一下。SQL Server 下载 | Microsoft

4、我这里是添加了一个在网上找的数据库脚本,然后还是运行下一控制器里的代码。我们就可以在数据库里看到运行结果。

项目根目录在bin/debug/net6.0目录下可以看到log文件夹,里面有个log.txt文件,打开就可以看到我们写的东西。

 总结一下Log4net的数据库配置过程

(1)Nuget引入程序包

(2)修改配置文件,支持写数据库

(3)初始化数据库日志表

(4)注入得到Log4net实例开始写日志

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET6.0的日志组件Log4net 的相关文章

  • smtpclient“发送邮件失败”

    这是我的代码 for int i 0 i lt number i MailAddress to new MailAddress iMail to MailAddress from new MailAddress iMail from iMa
  • 更改组合框下拉列表边框的颜色

    My code Private Sub ComboBox2 DrawItem sender As Object e As DrawItemEventArgs Handles ComboBox2 DrawItem If e Index lt
  • 如何对私有方法进行单元测试?

    我正在构建一个类库 它将有一些公共和私有方法 我希望能够对私有方法进行单元测试 主要是在开发时 但它也可能对未来的重构有用 这样做的正确方法是什么 如果您想对私有方法进行单元测试 则可能会出现问题 单元测试 一般来说 旨在测试类的接口 即其
  • 如何将一个控件的属性绑定到另一个控件的属性?

    我希望当表单被禁用时 表单中的 保存 按钮消失 我这样做 this formStackPanel IsEnabled someValue if this formStackPanel IsEnabled this saveButton Vi
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • 在 Windows CE 6.0 与 Windows Mobile 6.1 下进行开发的权衡是什么

    我有一个 Windows NET 应用程序 我计划将其 移植 并定制为移动设备 该应用程序由一个独立的 NET 程序组成 该程序与条形码扫描仪配合使用 具有简单的 UI 并将扫描结果记录到文件中 还有一个 Windows 服务 可以使用 W
  • 为什么处置/关闭 WCF 客户端代理很重要

    我听说即使在以下情况下也必须处置 或关闭 WCF 客户端代理 你没有使用会话 没有需要确定性清理的非托管资源 例如打开的套接字 例如 当使用具有默认绑定配置的 BasicHttpBinding 时 即使在流行的网页中也应该没问题 对吧 va
  • 适合 .Net 开发人员的 Grails/Roo

    我目前正在学习 Grails 和 Roo 绝大多数培训材料都是针对新开发人员或现有 Java 开发人员 有谁知道使用 Net C ASP Net Asp Net MVC 翻译现有开发经验的任何指南 资源或技巧 你做过很多 ASP MVC 吗
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没
  • 使用另一个 MEF 程序集中的类而不引用它

    我有 2 个 MEF 组件 设其为A成分和B成分 我需要的是能够从组件 A 中的组件 B 访问一个类 而不需要引用它 然后我想手动实例化该类的对象 目前我看到 MEF 允许使用 Import 自动实例化对象 它使用需要引用的接口 我可以使用
  • 根据日期和时间计算下一次运行任务的时间

    我有一个相当具体的问题 根据该任务的配置 找出计算程序中的 任务 下次运行时间的最佳方法 从配置此 任务 的一些事物的定义开始 首先 一个看起来很像框架的枚举DayOfWeek枚举 我称之为DaysOfWeek并将其标记为FlagsAttr
  • 文件是通过 Visual Studio 下载的,但不是通过 .exe 下载的

    当我尝试下载 a 时出现以下错误 pdf通过我的网址从文件 exe file 服务器违反了协议 部分 响应头 详细信息 CR 后必须跟 LF 但当我尝试从 Visual Studio 调试代码时 也会下载同样的内容 我完全迷失了 不知道发生
  • 在实体框架 6 中使用 SqlQuery>

    我正在尝试在 EF 6 中执行 SQL 查询 select查询返回两个字符串列 例如select a b 并且可以有任意数量的行 我想将结果映射到字典 但我无法摆脱以下错误 错误 1 无法将类型 System Data Entity Inf
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • C# Winform - 当用手指在触摸屏上移动到控件末尾时如何防止移动整个窗口

    我正在开发用于触摸屏的全屏 winform 应用程序 当我在表单上有任何控件时 例如listbox webBrowserControl 它具有可见的滚动条 有要滚动的内容 当我用手指移动到控件的末尾时 完整的表单向上 向下移动取决于移动方向
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • .net 运行时 - Silverlight 运行时 =?

    我用 google 搜索了一下 但没能找到 net CLR 中的哪些类未包含在 CoreCLR 又名 Silverlight 中的详细列表 Windows net Framework 中缺少什么 Silverlight 另外 是否存在 Si
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime

随机推荐

  • HttpClient 简介说明

    转自 HttpClient 简介说明 下文笔者将讲述HttpClient框架的简介说明 如下所示 HttpCient简介说明 HttpClient是一个开源项目 它是Apache Jakarta Common下的一个子项目 HttpClie
  • Invalid Address specified to RtlValidateHeap

    Invalid Address specified to RtlValidateHeap VC编程 最后推出对话框的时候 会有错误提示声音 硄 但是没有弹出错误提示对话框 症状描述与下面的类似 声音就和Assertion Failure一样
  • html遍历数组,JS数组遍历的几种方式

    JS数组遍历 基本就是for forin foreach forof map等等一些方法 以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种 普通for循环 代码如下 for j 0 j lt arr length j 简要
  • 【三电平SVPWM学习

    导读 本期对三电平SVPWM的原理和建模做一个简单介绍 并与两电平SVPWM做了一个对比 后面把三电平的SVPWM运用到异步电机直接转矩控制中 看与传统的两电平SVPWM 控制性能是否得到改善 模型可分享 关注公众号 浅谈电机控制 留下邮箱
  • 八大排序算法(六)——优先队列、堆和堆排序

    6 1 API 优先队列是一种抽象数据类型 它表示了一组值和对这些值的操作 优先队列最重要的操作就是删除最大元素和插入元素 6 2 初级实现 6 2 1 数组实现 无序 或许实现优先队列最简单方法就是基于下压栈的代码 insert 方法的代
  • java通过文件路径读取该路径下的所有文件并将其放入list中

    java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中 假设指定路径为path 目标集合为fileList 遍历指定路径下的所有文件 如果是目录文件则递归
  • 旋转链表(leetcode)

    61 旋转链表 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 示例 1 输入 head 1 2 3 4 5 k 2 输出 4 5 1 2 3 示例 2 输入 head 0 1 2 k 4 输出 2 0 1 提
  • centos安装配置hadoop超详细过程(含故障排除)

    1 集群部署介绍 1 1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 以Hadoop分布式文件系统 HDFS Hadoop Distributed Filesystem 和MapReduce Goog
  • 计算机科学丛书(2014-2018.Q1)

    ISBN 名称 作者 出版时间 978 7 111 53451 8 数学设计和计算机体系结构 原书第2版 美 戴维 莫尼 哈里斯 莎拉 L 哈里斯著 978 7 111 44075 8 嵌入式计算系统设计原理 美 Marilyn Wolf著
  • C#中string.Format输出内容中含有花括号的解决方法

    转载一篇 版权声明 本文为CSDN博主 九德真君 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net lzdidiv article details 69469
  • python matrix用法_numpy中matrix使用方法

    matrix T transpose 返回矩阵的转置矩阵 matrix H hermitian conjugate transpose 返回复数矩阵的共轭元素矩阵 matrix I inverse 返回矩阵的逆矩阵 matrix A bas
  • 基于C语言实现的文件压缩算法-哈夫曼编码

    哈夫曼编码 是一种数据压缩算法 通常用于无损数据压缩 该算法是由 David A Huffman在麻省理工学院就读理学博士 Doctor of Science 的时候发明的 这位大佬在1952年发表了相关的一篇论文A Method for
  • 页面上input输入框宽度实现自动调整

    input输入框宽度实现自动调整 本文介绍两种方式 一是通过获取input内容的宽度实现输入框宽度的自动调整 二是通过内容字符串的长度乘以文本字体大小的积 来实现输入框宽度的自动调整 1 input输入框宽度的获取方式一 由于input输入
  • 利用maven项目创建一个web项目工程(图文详解)

    最近正开始学习java 老师布置的第一个作业便是用maven项目创建一个web项目工程 不会 跑去百度了半天 跳出来的全是我们csdn的教程 但到创建资源包的时候就没法跟着做了 因为显示已存在 没法跟着创建了 那些文章基本一样的讲法 都是默
  • 超详细的用IDEA整合SSM框架和profile 配置环境

    SSM作为现在最流行的开发框架 很大的提升了开发效率 一些同学在SSM基础上的整合一些更实用的开发基础框架 被用来作为快速开发的基础框架 本次实践主要是以下3个目标 从最基础的SSM框架做起 摸索和处理SSM框架整合中可能会遇到的问题 使用
  • 手机知识:手机的快充技术是什么,看完本文你就懂了

    目录 1 什么是手机快充 2 目前主流的手机快充协议 2 1 PD协议 2 2 PE协议 联发科 2 3 QC协议 高通 2 4 VOOC闪充 OPPO厂商 2 5 SCP FCP闪充 华为厂商 2 6 FlashCharge闪充 Vivo
  • 【前后端数据交互:Axios】

    前后端数据交互 Axios Axios 介绍 在前端页面展示的数据大多数都是通过访问一个API获取的 做这件事的方法有好几种 例如jquery ajax vue resource axios 而vue resource是vue插件 但3版本
  • 基于RGB颜色空间使用OpenCV-Python实现照片换底

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 前一阵子家人报考教师资格证考试 因报名需要将蓝底的数字相片换成白底的 老猿虽然在学习图像处理相关开发技术 但并没有熟练使用的图像编辑
  • BigDecimal精度问题

    BigDecimal精度问题 在近来项目展示价格的时候 遇到了一个问题 一个价格为99999 999的商品在购物车中的展示却是100000 00 原因归结于在原项目代码中 是采用BigDecimal的格式 然而前端需要展示的时候 采用的却是
  • .NET6.0的日志组件Log4net

    前言 不允许让没有任何日志监控的项目上线 所以说真正开发起来必须要有监控 相当于多一双眼睛帮着我们看项目在运行时会不会有什么问题 我们要不断的在每个环节写日志 这样发生异常我们可以快速知道哪里有问题了 就可以快速解决 目录 一 Log4ne