nlog

Print a multi-line message with NLog

ε祈祈猫儿з 提交于 2020-05-11 07:20:01
问题 Is it possible with NLog to emit a multi-line message such that each line is formatted according to the current layout? E.g. 2015-12-17 11:37:38.0845 | 64 | INFO | ----------------------------------- 2015-12-17 11:37:38.0845 | 64 | INFO | Statistics: 2015-12-17 11:37:38.0845 | 64 | INFO | Crawling Requests 46887 /min 2015-12-17 11:37:38.0845 | 64 | INFO | Stored Documents 9910 /min 2015-12-17 11:37:38.0845 | 64 | INFO | ----------------------------------- Alternatively, is it possible with

C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁

╄→гoц情女王★ 提交于 2020-05-08 08:23:59
原文: C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁 系列文章 C#开发奇技淫巧一:调试windows系统服务 C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁 程序目录的整理 想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观。 如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用的程序各文件的分布: 【3rdLibs】 NLog.dll Newtonsoft.Json.dll …… 【MyLibs】 【Resources】 【Images】 Excecutable.exe Excecuteble.exe.config 网上有很多的文章述说这个,比如使用Assembly.Load,但是没有说明在程序中怎么使用,也没有给出具体的代码。这里我结合自己多年的实践经验,再把整个流程和方法详细叙述一遍,以便各位看官有个具体的体会。 系统搜索dll的目录以及顺序 CLR解析一个程序集会在一个根目录内进行搜索,整个探索过程又称Probing,这个根目录很显然就是当前包含当前程序集的目录。 AppDomainSetup这个类存储着探索目录的信息,其成员包括: ApplicationBase 、

单调队列优化DP(超详细!!!)

隐身守侯 提交于 2020-05-08 03:29:55
一、概念 1、单调队列定义:    其实单调队列就是一种 队列内的元素有单调性 (单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者 降低DP的维数 已达到降维来减少空间及时间的目的。 单调队列的一般应用:      维护区间最值      优化DP 【例一】 求m区间内的最小值(洛谷 P1440) 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。 输入格式 第一行两个数n,m。 第二行,n个正整数,为所给定的数列。 输出格式 n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。 输入 6 2 7 8 1 4 3 2 输出 0 7 7 1 1 3 思路: 1、暴力枚举以i-1为结尾的前m个数。时间O(n*m),T T T. 2、rmq求解O(nlog n) 貌似会T 3、线段树求解 O(nlog n) 当n=1e7时也超时,空间,代码量大 需要更优的O(n)的解法处理。 4、单调队列来了 因为每一个答案只与当前下标的前m个有关,所以可以用单调队列维护前m个的最小值,    考虑如何实现该维护的过程??    显然当前下标X的m个以前的元素(即下标小于X-M+1的元素

【紫书】算法竞赛之排序算法笔记

烈酒焚心 提交于 2020-05-06 15:36:52
一:冒泡排序(O(n^2)) 每组每个位置的数与它后面的数比较,前面数大于后面的数就交换数值,交换n-1组。 每次每组交换的时候,都会把最大的排到后面去,就类似与在水底泡泡慢慢的向上浮出。 特性: 稳定。 动图演示: 详细解析代码: #include<stdio.h> int main() { int a[] = { 3 , 44 , 38 , 5 , 47 , 15 , 36 , 26 , 27 , 2 , 46 , 4 , 19 , 50 , 48 }; // 为了方便大家理解,我将数值设为与动图一样的数值。 int n = 15 ; // 冒泡排序 for ( int i= 0 ;i<n- 1 ;i++) // 代表的是要做多少组比对,为什么是n-1呢? // 因为计数从0开始而且第一个数和自身没有比对的必要性。 for ( int j= 0 ;j<n- 1 -i;j++ ) // 代表组里面的序号,因为要与后面数做比较,而最后一个数没有与之比较的(可能会越界)所以n-1 // 为什么还要-i呢? // 因为每排过一遍,这一组最大值就排到后面去了,也就没必要再去比较了。 if (a[j] > a[j + 1 ]) { int temp = a[j]; a[j] = a[j + 1 ]; a[j + 1 ] = temp; } for ( int i = 0 ;i < n;i+

【模板】deque实现单调队列

浪尽此生 提交于 2020-05-06 10:54:21
双端队列 deque 容器: 关于 deque 最常用的有这几个函数 : 都是成员函数 双端队列模板题: 【洛谷】P2952 [USACO09OPEN]牛线Cow Line 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<deque> 6 using namespace std; 7 8 int n, cnt; 9 deque< int > q; 10 11 int main() { 12 scanf( " %d\n " , & n); 13 char s[ 21 ]; 14 for ( int i= 1 ; i<=n; ++ i) { 15 gets(s); 16 if (s[ 0 ] == ' A ' ) 17 if (s[ 2 ] == ' L ' ) q.push_front(++ cnt); 18 else q.push_back(++ cnt); 19 if (s[ 0 ] == ' D ' ) { 20 int m = 0 , j = 1 ; 21 while (s[j]< ' 0 ' || s[j]> ' 9 ' ) ++ j; 22 while (s[j]>= ' 0 ' && s[j]<= ' 9 ' ) 23 m = (m

ASP.NET Core如何在ActionFilterAttribute里做依赖注入

我们两清 提交于 2020-05-06 08:28:38
在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入。但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 问题 我的博客系统里有个用来删除订阅文件缓存的ActionFilter,想要在发生异常的时候记录日志。我的博客用的日志组件是NLog,因此不使用依赖注入的话,就直接使用LogManager.GetCurrentClassLogger()获得一个Logger的实例。整个过滤器的代码如下: public class DeleteSubscriptionCache : ActionFilterAttribute { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public override void OnActionExecuted(ActionExecutedContext context) { base.OnActionExecuted(context); DeleteSubscriptionFiles(); } private void DeleteSubscriptionFiles() { try { // ... } catch (Exception e) {

『线段树 Segment Tree』

柔情痞子 提交于 2020-05-05 19:52:36
<font size=3 face="微软雅黑"> <更新提示> <第一次更新> 更新了基础部分 <第二次更新>更新了$lazytag$标记的讲解 </font> <font size=3 face="微软雅黑"> <正文> 线段树 Segment Tree 今天来讲一下经典的线段树。 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 简单的说,线段树是一种基于分治思想的数据结构,用来维护序列的区间特殊值,相对于树状数组,线段树可以做到更加通用,解决更多的区间问题。 性质 1.线段树的每一个节点都代表了一个区间 2.线段树是一棵二叉树,具有唯一的根节点,其中,根节点代表的是整个区间$[1,n]$ 3.线段树的每一个叶节点代表的是长度为$1$的元区间$[x,x]$ 4.对于每一个节点$[l,r]$,它的左儿子被定义为$[l,mid]$,右儿子被定义为$[mid+1,r]$ 如图,这就是一棵维护了区间$[1,10]$的线段树。 我们还可以发现,线段树层数为$log_2n$层,除去最后一层,线段树是一棵完全二叉树。 建树 (build) 我们来考虑一下如何储存并建立一棵线段树。 由于线段树是二叉树,所以我们可以直接用数组存储结点的编号,即对于节点$x$储存在$a[p]$处,我们令$x$的左儿子储存在$a[p 2]$处

时间复杂度

别来无恙 提交于 2020-05-05 19:44:45
首先,理解时间复杂度的前提是理解时间频度。 时间频度定义 :时间频度是由“算法的执行时间和执行次数成正比”来决定的,记做T(n) 时间频度的特点 :忽略常数项(2n+ 30 和2n, 忽略30 )、忽略低次项(2n^3+ 2n 、2n^3+10, 忽略2n )、忽略系数(2n^4+5n、2n^4+9n, 忽略5和9 )。 多少次方是关键! 时间复杂度:是算法执行语句的次数。 计算时间复杂度有两种方法: 方法一是事后统计:使用某个排序算法结合程序A运行,运行完后查看时间。 事后分析计算排序的时间复杂度具有两个问题:一是 由于不同的电脑运行速度的快慢,在不同的电脑计算排序算法的时间复杂度的结果会被影响;二是 需要实际在运行之后才能知道该算法的时间复杂度结果。 方法二是事前估算:通过分析算法的时间复杂度得知。 计算时间复杂度的方法: ①将式子中的常数变为1。②只保留最高阶。③去掉系数。 eg:原式子:2n^3+7n+9——>2n^3+7n+1——>2n^3——>n^3,得到时间复杂度为O(n^3)。 常见的时间复杂度有8种(复杂度越高执行效率越低): 常数阶:O(1) 对数阶O(log2[底数]n[真数]) 线性阶:O(n) 线性对数阶:O(nlog2[底数]n[真数]) 平方阶:O(n^2)例如嵌套for 立方阶:O(n^3)例如3层嵌套for K次方:O(n^k)k层嵌套for\递归

Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统

喜夏-厌秋 提交于 2020-05-05 15:57:51
Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统 Elasticsearch 官方网站 Elasticsearch 文档 NLog.Targets.ElasticSearch package Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据。 它使用 Java 编写,基于 Apache Lucene ,尽管这些细节隐藏在 API 中。 通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。 但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。 快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB 级索引数据。 同时作为 Elastic stack (aka ELK) 的核心,提供了诸如 LogStash、Kibana 和更多的强大应用。 Kibana 是 Elasticsearch 中专门提供强有力的可视化查询Web应用程序。 使用Kibana,能非常简单地为 Elasticsearch 中索引的数据创建查询、图表和仪表盘。 Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP 调用,你可以尝试使用 curl 或

【数据结构与算法】数据结构基础知识总结(面试考点)

纵饮孤独 提交于 2020-05-05 15:56:25
数据结构 1. 数组和链表的区别? 从 逻辑结构 上来看,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。 从 内存存储 的角度看;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。 从访问方式 类看,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。 2. 简述快速排序过程 [!NOTE] 掌握所有常见的排序算法的手写实现,以及复杂度相关细节知识。 选择一个基准元素,通常选择第一个元素或者最后一个元素, 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值比基准值大。 此时基准元素在其排好序后的正确位置 然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。 3. 各类排序算法对比(熟练掌握) 3.1 时间复杂度来说 平方阶(O(n2))排序   各类简单排序:直接插入、直接选择和冒泡排序; 线性对数阶(O(nlog2n))排序    快速排序