.NET6中使用Log4net记录日志(二)记录日志到SqlServer数据库

news/2024/11/15 23:41:51/文章来源:https://www.cnblogs.com/sgxw/p/18202314

1、引用NuGet包(System.Data.SqlClient

 2、创建SqlServer数据库表(ProgramLog)

CREATE TABLE ProgramLog (
Id INT IDENTITY(1,1) PRIMARY KEY,
[Date] DATETIME,--记录时间
[Level] NVARCHAR(128),--日志级别
[RunTime] VARCHAR(128),--执行时长
[Thread] NVARCHAR(256),--线程号
[Line] NVARCHAR(256),--行号
[Message] NVARCHAR(max),--描述
[Exception] NVARCHAR(2000),--详情
[Logger] NVARCHAR(256) --类名
);

 3、更新配置文件(log4net.config),这里此配置文件属性,复制到输出目录,需设置为:始终复制

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <!--根配置-->
  <root>
    <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->
    <level value="ERROR"/>
    <level value="WARN"/>
    <level value="INFO"/>
    <level value="DEBUG"/>
    <appender-ref ref="AdoNetAppender" />
    <appender-ref ref="ErrorLog" />
    <appender-ref ref="WarnLog" />
    <appender-ref ref="InfoLog" />
    <appender-ref ref="DebugLog" />
  </root>
  <!--正常日志:记录正常日志-->
  <!-- appender 定义日志输出方式   将日志以回滚文件的形式写到数据库中。-->
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
    <bufferSize value="0" />
    <!-- 数据库连接字符串 -->
    <connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <connectionString value="Data Source=.;Initial Catalog=MainAPI;User ID=sa;Password=svse;Integrated Security=True;" />
    <!-- 日志表的结构 -->
    <commandText value="INSERT INTO [dbo].[ProgramLog]([Level],[RunTime],[Thread],[Line],[Message],[Exception],[Logger],[Date])VALUES (@log_level,@log_runtime,@thread,@log_line,@message,@exception,@logger,@log_date)"/>

    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>

    <parameter>
      <parameterName value="@log_runtime" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r" />
      </layout>
    </parameter>

    <parameter>
      <parameterName value="@log_line" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%L"/>
      </layout>
    </parameter>

    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </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>
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
  </appender>

  <!-- 错误 Error.log-->
  <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
    <!--目录路径,可以是相对路径或绝对路径-->
    <param name="File" value="log"/>
    <!--文件名,按日期生成文件夹-->
    <param name="DatePattern" value="/yyyy-MM-dd/&quot;Error.log&quot;"/>
    <!--追加到文件-->
    <appendToFile value="true"/>
    <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
    <rollingStyle value="Composite"/>
    <!--写到一个文件-->
    <staticLogFileName value="false"/>
    <!--单个文件大小。单位:KB|MB|GB-->
    <maximumFileSize value="200MB"/>
    <!--最多保留的文件数,设为"-1"则不限-->
    <maxSizeRollBackups value="-1"/>
    <!--日志输出格式//行号影响性能??-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n=====================================================================================================
                                %n[日志级别]%-5level
                                %n[记录时间]%date
                                %n[执行时间]%r
                                %n[线程]%t
                                %n[文件]%F
                                %n[行号]%L
                                %n[类名]%logger
                                %n[描述]%message
                                %n[详情]%exception"/>
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="ERROR" />
      <param name="LevelMax" value="ERROR" />
    </filter>
  </appender>

  <!-- 警告 Warn.log-->
  <appender name="WarnLog" type="log4net.Appender.RollingFileAppender">
    <!--目录路径,可以是相对路径或绝对路径-->
    <param name="File" value="log"/>
    <!--文件名,按日期生成文件夹-->
    <param name="DatePattern" value="/yyyy-MM-dd/&quot;Warn.log&quot;"/>
    <!--追加到文件-->
    <appendToFile value="true"/>
    <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
    <rollingStyle value="Composite"/>
    <!--写到一个文件-->
    <staticLogFileName value="false"/>
    <!--单个文件大小。单位:KB|MB|GB-->
    <maximumFileSize value="200MB"/>
    <!--最多保留的文件数,设为"-1"则不限-->
    <maxSizeRollBackups value="-1"/>
    <!--日志格式-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n=====================================================================================================
                                %n[日志级别]%-5level
                                %n[记录时间]%date
                                %n[执行时间]%r
                                %n[线程]%t
                                %n[文件]%F
                                %n[行号]%L
                                %n[类名]%logger
                                %n[描述]%message
                                %n[详情]%exception"/>
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="WARN" />
      <param name="LevelMax" value="WARN" />
    </filter>
  </appender>

  <!-- 信息 Info.log-->
  <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
    <!--目录路径,可以是相对路径或绝对路径-->
    <param name="File" value="log"/>
    <!--文件名,按日期生成文件夹-->
    <param name="DatePattern" value="/yyyy-MM-dd/&quot;Info.log&quot;"/>
    <!--追加到文件-->
    <appendToFile value="true"/>
    <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
    <rollingStyle value="Composite"/>
    <!--写到一个文件-->
    <staticLogFileName value="false"/>
    <!--单个文件大小。单位:KB|MB|GB-->
    <maximumFileSize value="200MB"/>
    <!--最多保留的文件数,设为"-1"则不限-->
    <maxSizeRollBackups value="-1"/>
    <!--日志格式-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n=====================================================================================================
                                %n[日志级别]%-5level
                                %n[记录时间]%date
                                %n[执行时间]%r
                                %n[线程]%t
                                %n[文件]%F
                                %n[行号]%L
                                %n[类名]%logger
                                %n[描述]%message
                                %n[详情]%exception"/>
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="INFO" />
    </filter>
  </appender>

  <!-- 调试 Debug.log-->
  <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
    <!--目录路径,可以是相对路径或绝对路径-->
    <param name="File" value="log"/>
    <!--文件名,按日期生成文件夹-->
    <param name="DatePattern" value="/yyyy-MM-dd/&quot;Debug.log&quot;"/>
    <!--追加到文件-->
    <appendToFile value="true"/>
    <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
    <rollingStyle value="Composite"/>
    <!--写到一个文件-->
    <staticLogFileName value="false"/>
    <!--单个文件大小。单位:KB|MB|GB-->
    <maximumFileSize value="200MB"/>
    <!--最多保留的文件数,设为"-1"则不限-->
    <maxSizeRollBackups value="-1"/>
    <!--日志格式-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%n=====================================================================================================
                                %n[日志级别]%-5level
                                %n[记录时间]%date
                                %n[执行时间]%r
                                %n[线程]%t
                                %n[文件]%F
                                %n[行号]%L
                                %n[类名]%logger
                                %n[描述]%message
                                %n[详情]%exception"/>
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
    </filter>
  </appender>
</log4net>

 4、Log4net官方写入数据库文档:https://logging.apache.org/log4net/release/config-examples.html

5、程序中调用日志功能

Log4netHelper.Info("token 认证 成功1");
Log4netHelper.Warning("token 认证 成功222");
Log4netHelper.Debug("token 认证 成功3233");
Log4netHelper.Error("token 认证 成功444");

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709307.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP32RF002 是深基于 ARM Cortex-M0+内核的超低功耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 SoC 芯片

产品简介DP32RF002 是深基于 ARM Cortex-M0+内核的超低功耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 SoC 芯片。工作于 200 ~960MHz 范围内,支持灵活可设的数据包格式,支持自动应答和自动重发功能,支持跳频操作,支持 FEC 功能,同时内部集成了完整的射频接收机…

12代处理器在虚拟机中安装Windows98SE

最近想把以前写的那个Windows98开始菜单完善一下,就想装个Windows98来参考参考。这里把安装过程分享一下。 项目地址:https://github.com/zhaotianff/WindowsX.git 路过的小伙伴可以帮忙点个star。 本文以VMware17虚拟机为例,介绍如何在12代处理器中安装Windows 98SE。 安装…

配置AutoFacManger.cs

使用配置AutoFacManger的好处是不用我们像之前一样写一层注入一层,这样自动注入只要我们命名规范的话,就可以实现不在用去Program中手动后注入 创建一个类里边写public class AutoFacManger : Autofac.Module{/// <summary>/// 自动注入/// </summary>/// <pa…

小米面试:如何实现优先级线程池?

我们知道,线程池中的所有线程都是由统一的线程工厂来创建的,当我们指定线程工厂时,线程池中的所有线程会使用我们指定的线程工厂来创建线程;但如果没有指定线程工厂,则会使用默认的线程工厂 DefaultThreadFactory 来创建线程,核心源码如下: DefaultThreadFactory() {@Su…

R机械设计 V4.1(2024.05.20)

R机械设计软件是兴力剑公司为工程师提供计算、查询服务的机械设计平台。 PC端包含一般设计资料、气、液压传动、联接件、机械传动、机器人、轴承、操作件、管件、润滑与密封、弹簧、材料、工具、模具、刀具、夹具、电机减速机、电气控制等多个大模块。用户只需输入已知条…

SS820-ASEMI高耐压肖特基二极管SS820

SS820-ASEMI高耐压肖特基二极管SS820编辑:ll SS820-ASEMI高耐压肖特基二极管SS820 型号:SS820 品牌:ASEMI 封装:SMB 最大平均正向电流(IF):8A 最大循环峰值反向电压(VRRM):200V 最大正向电压(VF):0.85V 工作温度:-55C~150C 反向恢复时间:5ns 芯片个数:1 芯片尺…

论文阅读:Reasoning with Latent Structure Refinement for Document-Level Relation Extraction

Nan G, Guo Z, Sekulić I, et al. Reasoning with latent structure refinement for document-level relation extraction[J]. arXiv preprint arXiv:2005.06312, 2020. 代码和预训练模型的github链接 LSR模型本文提出了用于文档级关系提取任务的Latent Structure Refinement(…

Oracel数据库常用命令集

一、数据库常用查询 1.查询数据库用户名 SELECT * FROM ALL_USERS; --或 select username from sys.dba_users;2、查询数据库名 select name from v$database;--- 如果是管理员等同权限,也可通过SQL*Plus或SQLcl中使用以下语句 show parameter db;3、查询数据库的实例名 selec…

使用私有云搭建ceph集群(一)

环境背景 本次ceph集群的搭建过程,利用学校数据中心服务器上部署的openstack私有云来进行实验学习 [登录账户]一、初始配置(两张网卡) network1配置 点击+ 创建网络进行网络的创建,首先对网络进行命名对网络中的子网进行配置,设置子网名称subnet1以及网络地址192.168.1.0/24…

OceanBase企业版4.x支持指定租户合并

下午同事询问3.x版本是否支持指定租户的合并操作,印象中没有,在官网上查询了下,也没有相关的操作手册,官方手册3.x地址如下: https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-0000000001417800 正好手头上还有4.x的环境,在查询4.x官网后发现,4.x版本已…

电视剧《庆余年2》第二季全集完整版高清迅雷下载1080p/720p[HD]

电视剧《庆余年2》作为继第一部的续集,持续了第一部的高燃剧情和精彩演绎,再次引起了广大观众的关注与热议。本剧以庆帝刘弼铭为主线,讲述了他在林殊之死后继续战斗的故事。此次续集的推出,再度掀起了一股庆余年的热潮,并展现了中国电视剧在制作和创作方面的高水平和创新力…

axis2生成wsdl回执参数首字母大小写问题

在跟局方对接接口的时候,局方回执我的wsdl接口,发现收不到同步回执,怀疑问题为回执参数首字母小写导致代码中的参数对象首字母确实是大写,但生成的wsdl文件确变成了小写,目前是用axis2生成的 参考 : https://bbs.csdn.net/topics/390457284 发现了变为小写的原因,选择使用…