OperatorLog

CREATE TABLE [dbo].[OperatorLog](
[Id] [BIGINT] IDENTITY(1,1) NOT NULL,
[Createdate] [DATETIME] NOT NULL DEFAULT (GETDATE()),
[CreatedBy] [NVARCHAR](50) NULL,
[IsDeleted] [BIT] NOT NULL,
[ModuleName] [NVARCHAR](30) NULL,
[Origin] [NVARCHAR](50) NULL,
[Type] [NVARCHAR](50) NULL,
[LogLevel] [NVARCHAR](20) NOT NULL,
[LogMessage] [NVARCHAR](500) NULL,
[Exception] [NVARCHAR](500) NULL,
[Logger] [NVARCHAR](500) NULL
CONSTRAINT [PK_OperatorLog] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) 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'OperatorLog', @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'OperatorLog', @level2type=N'COLUMN',@level2name=N'Createdate'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'CreatedBy'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否删除' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'IsDeleted'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'模块名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'ModuleName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Origin'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Type'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志级别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogLevel'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogMessage'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'异常信息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Exception'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @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'OperatorLog'
GO

PathHelper

using System;
using System.IO;
using System.Reflection; namespace ShiShuo.Utilities
{
public static class PathHelper
{
private static readonly string _appDir;
private static readonly string _configDir;
private static readonly string _dataDir;
static PathHelper()
{
//网站与后台服务路径不同,网站需要上翻一级;后台服务则不需要;通过判断使用的配置文件是否是web.config来判断是网站,还是服务。
bool isWeb = false;
var appDomain = AppDomain.CurrentDomain; if (appDomain != null)
{
var startInfo = appDomain.SetupInformation;
if (startInfo != null)
{
if (startInfo.ConfigurationFile != null)
{
if (startInfo.ConfigurationFile.EndsWith("web.config", StringComparison.OrdinalIgnoreCase))
{
isWeb = true; //配置文件是网站
}
}
}
}
_appDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring())); //获取此处配置文件在程序目录
//_appDir = _appDir.Substring(0, _appDir.Length - 4); if (isWeb)
{
_appDir = _appDir.Substring(, _appDir.LastIndexOf("\\", StringComparison.Ordinal)); // LastIndexOf("\\") => LastIndexOf(@"\"),向上翻一级
}
_configDir = Path.Combine(_appDir, "Config\\");
_dataDir = Path.Combine(_appDir, "App_Data\\");
}
#region 公共目录
/// <summary>
/// 应用程序所在的目录
/// </summary>
public static string AppDir => _appDir; /// <summary>
/// 根目录中的Cinfig文件夹
/// </summary>
public static string ConfigDir => _configDir; /// <summary>
/// 根目录中的App_Data文件夹
/// </summary>
public static string DataDir => _dataDir; #endregion
}
}

NLogger

using NLog;
using NLog.Config;
using System;
using System.IO; namespace ShiShuo.Utilities {
public class NLogger {
readonly Logger _logger; private static NLogger _instance;
private static readonly object _syncObject = new object(); public static NLogger GetInstance() {
if (_instance != null) {
return _instance;
}
lock (_syncObject) {
if (_instance != null) {
return _instance;
}
string configPath = Path.Combine(PathHelper.ConfigDir, "NLog.config");
LogManager.Configuration = new XmlLoggingConfiguration(configPath, true);
_instance = new NLogger("MyLogger");
//_instance = new NLogger(NLog.LogManager.GetCurrentClassLogger());
return _instance;
}
} private NLogger(NLog.Logger logger) {
this._logger = logger;
} public NLogger(string name)
: this(NLog.LogManager.GetLogger(name)) {
}
public static NLogger Default { get; private set; } private LogEventInfo lei = new LogEventInfo();
static NLogger() {
string configPath = Path.Combine(PathHelper.ConfigDir, "NLog.config");
LogManager.Configuration = new XmlLoggingConfiguration(configPath, true);
Default = new NLogger("MyLogger");
//Default = new NLogger(NLog.LogManager.GetCurrentClassLogger());
} #region Debug
public void Debug(string msg, params object[] args) {
_logger.Debug(msg, args);
} public void Debug(string msg, Exception err) {
_logger.Debug(err, msg);
}
#endregion #region Info
public void Info(string msg, params object[] args) {
_logger.Info(msg, args);
} public void Info(string msg, Exception err) {
_logger.Info(err, msg);
}
#endregion #region Warn
/// <summary>
///警告
/// </summary>
/// <param name="msg">警告信息</param>
/// <param name="args">动态参数</param>
public void Warn(string msg, params object[] args) {
_logger.Warn(msg, args);
}
/// <summary>
///警告
/// </summary>
/// <param name="msg">警告信息</param>
/// <param name="err">异常信息</param>
public void Warn(string msg, Exception err) {
_logger.Warn(err, msg);
}
#endregion #region Trace
/// <summary>
/// 使用指定的参数在跟踪级别写入诊断消息
/// </summary>
/// <param name="msg">跟踪信息</param>
/// <param name="args">动态参数</param>
public void Trace(string msg, params object[] args) {
_logger.Trace(msg, args);
}
/// <summary>
/// 使用指定的参数在跟踪级别写入诊断消息
/// </summary>
/// <param name="msg">跟踪信息</param>
/// <param name="args">异常信息</param>
public void Trace(string msg, Exception err) {
_logger.Trace(err, msg);
}
#endregion #region Error
/// <summary>
/// 使用指定的参数在错误级别写入诊断消息。
/// </summary>
/// <param name="msg">错误信息</param>
/// <param name="args">动态参数</param>
public void Error(string msg, params object[] args) {
_logger.Error(msg, args);
}
/// <summary>
/// 使用指定的参数在错误级别写入诊断消息。
/// </summary>
/// <param name="msg">错误信息</param>
/// <param name="args">异常信息</param>
public void Error(string msg, Exception err) {
_logger.Error(err, msg);
}
#endregion #region Fatal
/// <summary>
/// 使用指定的参数在致命级别写入诊断消息。
/// </summary>
/// <param name="msg">致命错误</param>
/// <param name="args">动态参数</param>
public void Fatal(string msg, params object[] args) {
_logger.Fatal(msg, args);
}
/// <summary>
/// 使用指定的参数在致命级别写入诊断消息。
/// </summary>
/// <param name="msg">致命错误</param>
/// <param name="args">异常信息</param>
public void Fatal(string msg, Exception err) {
_logger.Fatal(err, msg);
}
#endregion /// <summary>
/// 写入日志信息
/// </summary>
/// <param name="operatorLogModel">操作信息</param>
public void InsOperatorLog(OperatorLogModel operatorLogModel) {
var level = LogLevel.Info;
if (!string.IsNullOrEmpty(operatorLogModel.LogLevel))
{
switch (operatorLogModel.LogLevel) {
case "Trace":
level = LogLevel.Trace;
break;
case "Debug":
level = LogLevel.Debug;
break;
case "Info":
level = LogLevel.Info;
break;
case "Warn":
level = LogLevel.Warn;
break;
case "Error":
level = LogLevel.Error;
break;
case "Fatal":
level = LogLevel.Fatal;
break;
}
}
if (operatorLogModel.LogMessage.Length > ) {
operatorLogModel.LogMessage = operatorLogModel.LogMessage.Substring(, );
} lei.Properties["Createdate"] = operatorLogModel.Createdate;
lei.Properties["IsDeleted"] = operatorLogModel.IsDeleted;
lei.Properties["CreatedBy"] = operatorLogModel.CreatedBy;
lei.Properties["ModuleName"] = operatorLogModel.ModuleName;
lei.Properties["Origin"] = operatorLogModel.Origin;
lei.Properties["LogMessage"] = operatorLogModel.LogMessage;
lei.Properties["Type"] = operatorLogModel.Type;
lei.Level = level;
lei.Message = operatorLogModel.LogMessage;
_logger.Log(level, lei); } }
}

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"
throwConfigExceptions="true"
internalLogLevel="Debug"
internalLogToTrace="true">
<targets>
<!--写入文件-->
<target xsi:type="File" name="DebugFile" fileName="${basedir}/Logs/Debug/${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target>
<target xsi:type="File" name="InfoFile" fileName="${basedir}/Logs/Debug/${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target>
<target xsi:type="File" name="ErrorFile" fileName="${basedir}/Logs/Debug/${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target>
<target xsi:type="Database" name="DBLogFile" >
<dbProvider>System.Data.SqlClient</dbProvider>
<connectionString>
Data Source=.\sql2014;Initial Catalog=YIDaSi_richdata;Persist Security Info=true;User ID=sa;Password=Aa123456;
</connectionString>
<commandText>
INSERT INTO OperatorLog(Createdate,CreatedBy,IsDeleted,ModuleName,Origin,Type,LogLevel,LogMessage,Exception,Logger) VALUES(@Createdate,@CreatedBy,@IsDeleted,@ModuleName,@Origin,@Type,@LogLevel,@LogMessage,@Exception,@Logger)
</commandText>
<!--<parameter name="@Createdate" layout="${event-context:item=Createdate}" />-->
<parameter name="@Createdate" layout="${date}" />
<parameter name="@CreatedBy" layout="${event-context:item=CreatedBy}" />
<parameter name="@IsDeleted" layout="${event-context:item=IsDeleted}" />
<parameter name="@ModuleName" layout="${event-context:item=ModuleName}" />
<parameter name="@Origin" layout="${event-context:item=Origin}" />
<parameter name="@Type" layout="${event-context:item=Type}" />
<parameter name="@LogLevel" layout="${level}" />
<!--<parameter name="@LogMessage" layout="${event-context:item=LogMessage}" />-->
<parameter name="@LogMessage" layout="${message}" />
<parameter name="@Exception" layout=" ${exception}" />
<parameter name="@Logger" layout=" ${logger}" />
</target>
</targets>
<rules>
<!--根据日志级别分别写文件,也可以放一个文件中-->
<!--<logger name="DbLogger" levels="Debug,Info,Error" writeTo="MyFile" />-->
<logger name="MyLogger" level="Debug" writeTo="DebugFile" />
<logger name="MyLogger" level="Info" writeTo="InfoFile" />
<logger name="MyLogger" level="Error" writeTo="ErrorFile" />
<!--写数据库-->
<logger name="MyLogger" levels="Trace,Debug,Info,Error" writeTo="DBLogFile"/> </rules>
</nlog>

日志插件对比

https://dotnet.libhunt.com/project/log4net/vs/semantic-logging?rel=cmp-cmp

日志记录插件源码:

https://github.com/NLog/NLog

https://github.com/serilog/serilog

https://github.com/apache/log4net

https://github.com/elmah/Elmah

https://github.com/logary/logary

https://www.cnblogs.com/yiliukejich0614-1234/p/9914376.html NLog组件
https://www.cnblogs.com/TianFang/p/4003749.html
https://blog.csdn.net/Dandelion_gong/article/details/78018056
https://blog.csdn.net/weixin_33915554/article/details/85521919
https://www.cnblogs.com/tider1999/p/4308440.html

NLog记录日志到本地或数据库的更多相关文章

  1. .Net Core 使用NLog记录日志到文件和数据库

    NLog 记录日志是微软官方推荐使用. 接下来,通过配置日志记录到文件和Sql Server数据库. 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-Package 包 ...

  2. Log4net记录日志到本地或数据库

    OperatorLog /****** Object: Table [dbo].[OperatorLog] Script Date: SET ANSI_NULLS ON GO SET QUOTED_I ...

  3. [转]C# 使用Nlog记录日志到数据库

    本文转自:http://www.cnblogs.com/weixing/archive/2013/04/26/3044422.html 摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输 ...

  4. C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名

    原文地址:http://dotnet.9sssd.com/csbase/art/793 [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数 ...

  5. C# 使用Nlog记录日志到数据库

    [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中.本文为你介绍C# 使用Nlog记录日志到数据库. Nlog是一个很不错的.NET ...

  6. 从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之四Nlog记录日志至数据库

    为什么要进行日志记录呢?为什么要存至数据库呢?只能说日志记录是每个系统都应当有的. 好的日志记录方式可以提供我们足够多定位问题的依据.查找系统或软件或项目的错误或异常记录.程序在运行时就像一个机器人, ...

  7. Asp.Net Core中使用NLog记录日志

    2019/10/28, Asp.Net Core 3.0, NLog 4.6.7, NLog.Web.AspNetCore 4.9.0 摘要:NLog在asp.net网站中的使用,NLog日志写入数据 ...

  8. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  9. .NET中使用NLog记录日志

    以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂.下面小编就和大伙分享一下NLog的使用方式. 引用NLog.Config 在使用NLog之前,我们要首先添加对NLog.Co ...

随机推荐

  1. Redis集群,备份,哨兵机制

    原文:https://blog.csdn.net/zy345293721/article/details/87536144 1.集群        先来简单了解下redis中提供的集群策略, 虽然re ...

  2. O-超大型LED显示屏

    Input 输入包含不超过100组数据.每组数据第一行为”START hh:mm:ss”,表示比赛开始时刻为hh:mm:ss.最后一行为”END hh:mm:ss”,即比赛结束时刻.二者之间至少会有一 ...

  3. NOI-LINUX

    先把配置背过吧: (set-background-color "gray15")(set-foreground-color "gray")(global-lin ...

  4. LeetCode 235. 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先 ...

  5. 工具使用——IDEA常用的几种插件

    Rainbow Brackets:彩虹颜色的括号 Maven Helper :分析依赖冲突插件 Grep Console:显示不同日志级别不同颜色 Mybatis Log Plugin:直接将Myba ...

  6. [HTTP知识体系]前端常用的一些参数

    1.http常见状态码(status code) 200(成功) 服务器已成功处理了请求.通常,这表示服务器提供了请求的网页. 301 (永久移动) 请求的网页已永久移动到新位置. 服务器返回此响应( ...

  7. [易学易懂系列|golang语言|零基础|快速入门|(一)]

    golang编程语言,是google推出的一门语言. 主要应用在系统编程和高性能服务器编程,有广大的市场前景,目前整个生态也越来越强大,未来可能在企业应用和人工智能等领域占有越来越重要的地位. 本文章 ...

  8. git log混乱之混乱操作

    好几个分支 然后就混乱了 git log信息一坨屎 git 删除某次指定的提交 git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化. 以删除master分支为例 #新建一个备份的分支 ...

  9. if_else

    //if.......else if......else //object IF_ELSE {// def main(args:Array[String]){// var x=30// if (x== ...

  10. Centos7.5 ZABBIX4.0.3版本的编译安装

    Zabbix监控的搭建理论 1.      Zabbix Server会去采集监控数据,采集的监控数据会写入到SQL数据库 2.      Zabbix的WEB后端采用php语言开发,所有配置信息.用 ...