NLog写日志到数据库

news2024/11/23 7:11:45

需求:NLog写日志到数据库

一、必须要安装:

System.Data.SqlClient

二、 NLog配置:

<?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="off"
      internalLogFile="nlog.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <targets>
        <target name="ApiTrace" xsi:type="Database" useTransactions="true"
                dbProvider="System.Data.Sqlclient.SqlConnection,System.Data.Sqlclient"
        connectionString="Server=127.0.0.1;Database=LogDb;UID=sa;Password=a1!"
        commandText="INSERT INTO Sys_Logs (ID, Logger, Level, Host, Url , Method, Cookie, UserAgent, QueryString, Body , Message, CreateTime, IPAddress, Elapsed,UserId,UserName,ProjectName) VALUES (newId(), @Logger, @Level, @Host, @Url , @Method, @Cookie, @UserAgent, @QueryString, @Body , @Message, @CreateTime, @IPAddress, @Elapsed,@UserId,@UserName,'学生端');">
            <parameter name="@Logger" layout="${logger}" />
            <parameter name="@Level" layout="${uppercase:${level}}" />
            <parameter name="@Host" layout="${aspnet-request-host}" />
            <parameter name="@Url" layout="${aspnet-request-url:IncludeScheme=false:IncludeHost=false}" />
            <parameter name="@Method" layout="${aspnet-request-method}" />
            <parameter name="@Cookie" layout="${aspnet-request-headers:HeaderNames=SYSTOKEN:ValuesOnly=true}" />
            <parameter name="@UserAgent" layout="${aspnet-request-useragent}" />
            <parameter name="@QueryString" layout="${aspnet-request-querystring:OutputFormat=JSON}" />
            <parameter name="@Body" layout="${event-properties:item=RequestBody}" />
            <parameter name="@Message" layout="${message}" />
            <parameter name="@CreateTime" layout="${longdate}" />
            <parameter name="@IPAddress" layout="${aspnet-request-ip}" />
            <parameter name="@Elapsed" layout="${event-properties:item=Elapsed}"/>
            <parameter name="@UserId" layout="${event-properties:item=UserId}"/>
            <parameter name="@UserName" layout="${event-properties:item=UserName}"/>
        </target>
        <target name="Info" xsi:type="File" layout="**************************************************************************************************************************${newline} 日志时间 : ${longdate} ${newline} 日志来源 : ${logger} ${newline} 日志级别 : ${uppercase:${level}} ${newline} 日志内容 : ${message}${newline}" fileName="${basedir}/Logs/${date:format=yyyyMM}/Info-${shortdate}.log" />
        <target name="Warn" xsi:type="File" layout="**************************************************************************************************************************${newline} 日志时间 : ${longdate} ${newline} 日志来源 : ${logger} ${newline} 日志级别 : ${uppercase:${level}} ${newline} 日志内容 : ${message}${newline}" fileName="${basedir}/Logs/${date:format=yyyyMM}/Warn-${shortdate}.log" />

        <target name="error" xsi:type="File" layout="**************************************************************************************************************************${newline} 日志时间 : ${longdate} ${newline} 日志来源 : ${logger} ${newline} 日志级别 : ${uppercase:${level}} ${newline} 日志内容 : ${message}${newline}" fileName="${basedir}/Logs/${date:format=yyyyMM}/ERROR-${shortdate}.log" />
        <target name="debug" xsi:type="File" layout="**************************************************************************************************************************${newline} 日志时间 : ${longdate} ${newline} 日志来源 : ${logger} ${newline} 日志级别 : ${uppercase:${level}} ${newline} 日志内容 : ${message}${newline}" fileName="${basedir}/Logs/${date:format=yyyyMM}/DEBUG-${shortdate}.log" />
    </targets>
    <rules>
        <!-- add your logging rules here -->
        <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <logger name="*" level="Trace" writeTo="ApiTrace" />
        <logger name="*" level="Info" writeTo="Info" />
        <logger name="*" level="Warn" writeTo="Warn" />
        <logger name="*" level="Debug" writeTo="debug" />
        <logger name="*" level="Error" writeTo="error" />

    </rules>
</nlog>

三、数据库:

USE [LogDb]
GO

/****** Object:  Table [dbo].[Sys_Logs]    Script Date: 2023/7/14 11:17:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Sys_Logs](
    [ID] [nvarchar](36) NOT NULL,
    [Logger] [nvarchar](50) NULL,
    [Level] [nvarchar](50) NULL,
    [user] [nvarchar](50) NULL,
    [Url] [nvarchar](255) NULL,
    [Host] [nvarchar](100) NULL,
    [Method] [nvarchar](10) NULL,
    [UserAgent] [nvarchar](255) NULL,
    [Cookie] [nvarchar](100) NULL,
    [QueryString] [nvarchar](max) NULL,
    [Body] [nvarchar](max) NULL,
    [Message] [nvarchar](max) NULL,
    [Elapsed] [int] NULL,
    [CreateTime] [datetime2](6) NULL,
    [IPAddress] [nvarchar](50) NULL,
    [UserId] [nvarchar](100) NULL,
    [UserName] [nvarchar](500) NULL,
    [ProjectName] [nvarchar](100) NULL,
 CONSTRAINT [PK__Sys_Logs__3214EC278989976B] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'ID'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Logger'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志等级' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Level'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Url'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主机地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Host'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'请求方式' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Method'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'浏览器标识' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'UserAgent'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Cookie' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Cookie'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'URL参数' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'QueryString'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'请求内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Body'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志信息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Message'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'请求耗时' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'Elapsed'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'CreateTime'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'IPAddress'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作人Id' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'UserId'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作人账号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'UserName'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'项目名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs', @level2type=N'COLUMN',@level2name=N'ProjectName'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志管理' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Sys_Logs'
GO

四、Program

public class Program

    {

        public static void Main(string[] args)
        {

            var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
            try
            {
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception exception)
            {
                logger.Error(exception, exception.Message + " || " + exception.StackTrace + "Stopped program because of exception");
                throw;
            }
            finally
            {
                LogManager.Shutdown();
            }
        }


        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                .UseUrls(AppSettings.Configuration["Startup:ApiUrls"].Split(';'))
                .ConfigureKestrel(serverOptions =>
                {
                    serverOptions.AllowSynchronousIO = true;//ͬ IO
                })
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                    logging.AddDebug();
                    logging.AddConsole();
                });
            }).UseNLog();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存css实现动态时钟背景

代码实现 <!DOCTYPE html> <html lang"en"> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>Title</title><meta name"referrer" content"no-referrer…

Spring的控制翻转(IOC)与依赖注入(DI)

SpringIOC 即 Inversion of Control&#xff0c;缩写为 IOC&#xff0c;就是由 Spring IoC 容器管理对象&#xff0c;而非传统实现中由程序代码直接操控. 使用IOC容器管理bean&#xff08;IOC&#xff09; 在IOC容器中将有依赖关系的bean进行关系绑定 最终达到的目的&#…

【C】回调函数和qsort详解

回调函数概念 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一 个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用&#xff0c;…

七大排序算法——快速排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、快速排序核心思想Hoare法挖坑法前后指针法(选学) 三、性能分析四、算法优化优化基准的选取优化少量数据时的排序方案优化后的完整代码 五、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序…

基于ChatGPT和私有知识库搭建Quivr项目

准备工作 安装docker和docker-compose申请supabase账号 拉取Quivr代码 git clone https://github.com/StanGirard/Quivr.git 复制.XXXXX_env文件 cp .backend_env.example backend/.env cp .frontend_env.example frontend/.env 更新backend/.env和frontend/.env文件 ba…

靶场的安装

sqli-lab 1.将安装包解压放到WWW目录下 2.修改 db-creds.inc文件里面的数据库的用户名密码为自己的用户名密码 路径&#xff1a;D:\phpStudy_64\phpstudy_pro\WWW\sqli-labs-master\sql-connections\db-creds.inc 3. 更改php版本位5.9版本&#xff0c;不然会报错 4.安装数…

【采用有限元法技术计算固有频率和欧拉屈曲荷载】使用有限元法的柱子的固有频率和屈曲荷载(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Android JNI 异常处理 (十一)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI的类 JNIException.java 🔥 package com.cmake.ndk1.jni;public class JNIException {static {System.loadLibrary("exception-lib");}public native void nativeInvokeJavaException();public native void nativ…

B站这些“搬运工”还能有这么高的流量吗?

飞瓜数据&#xff08;B站版&#xff09;观察发现&#xff0c;B站经常有一些搬运视频能够获得超高流量。 比如拉取近15天的B站热门视频&#xff0c;位列前排的就有两个是搬运二创视频&#xff0c;播放量高达900万上下&#xff0c;可以说是爆款视频了。 这些视频有一个相同的点就…

Qt Https通信: TLS initialization failed 解决方法

Qt Https通信&#xff1a; TLS initialization failed 解决方法&#xff0c;Window端使用Qt 做开发请求Https资源时&#xff0c;会经常遇到 TLS initialization failed。 原因分析&#xff1a; 在Qt中并未包含 SSL所包含的库&#xff0c;因此需要开发者&#xff0c;自己将库拷贝…

最新华为鸿蒙4.0安装谷歌服务框架,安装Play商店,谷歌Google,GMS

最近华为推出了最新鸿蒙4.0开发者Beta版本&#xff0c;让用户测试体验。那么测试体验的机器主要是最近发布的几款机器为P60,P60 Pro, mate50,mate50 pro等几款产品可以先期进行体验测试鸿蒙4.0&#xff0c;那么很多的用户在疑问我升级到鸿蒙4.0。是不是还是可以使用Google谷歌服…

LINUX环境小实验

实验报告 实验名称 小环境搭设 实验目的 1.搭建DHCP服务器&#xff08;IP&#xff1a;192.168.100.253静态IP网卡vmnet1&#xff09; 2.搭建DNS&#xff08;通过DHCP服务器分到指定的IP&#xff1a;192.168.100.252&#xff09; 3.搭建网站服务&#xff08;通过DHCP服务器分…

波分复用(WDM)基本原理

文章目录 波分复用WDMDWDM解决问题&#xff0c;特点&#xff0d;超长距离无电中继传输&#xff0c;降低成本 波分系统的基本组成DWDM网元基本类型波分常见站点类型OM/OD技术&#xff0d;波分复用器主要参数 DWDM系统关键技术光转发技术 OM/OD技术&#xff0d;波分复用器件 波分…

Bun 0.6.14发布,1.0版预计发布于9月7日

Bun 是一个 JavaScript 运行时。 Bun 是一个从头开始构建的新 JavaScript 运行时&#xff0c;旨在服务现代 JavaScript 生态系统。它有三个主要设计目标&#xff1a; 速度。包子启动快&#xff0c;运行也快。它扩展了 JavaScriptCore&#xff0c;即为 Safari 构建的注重性能的 …

Office如何通过VSTO进行PPT插件开发?

文章目录 0.引言1.工具准备2.PPT外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO&#xff08;Visual Studio Tools for Office &#xff09;是VBA的替代&#xff0c;是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展O…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

【979. 在二叉树中分配硬币】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应有 node.val 枚硬币&#xff0c;并且总共有 N 枚硬币。 在一次移动中&#xff0c;我们可以选择两个相邻的结点&#x…

【C++】list简单介绍

list基本功能介绍 前言正式开始构造函数push_backiteratorpush_frontinserterasespliceremoveuniquereversesortmerge 前言 本篇不会讲太多细节&#xff0c;就说一下STL库中一些函数的基本用法&#xff0c;如果想要了解细节上的东西的话&#xff0c;建议看我string的介绍&…

QT ui_xxx.h: no such file or directory”

使用QT新建子窗口后,编译无法通过 mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl labelwindow::labelwindow(class QWidget *)" (??0labelwindowQEAAPEAVQWidgetZ)&#xff0c;该符号在函数 "private: void __cdecl MainWindow::o…

android studio 添加并读取json配置文件

第一步&#xff1a;在android studio中添加json文件&#xff1b; 第二步&#xff1a;读取文件的函数 private String[] getJosnData(){String result[] null;List<String> list new ArrayList<>();try {//获取本地的Json文件AssetManager assetManager mConte…