Nlog-动态修改DatabaseTarget,对数据库字符串进行加密
Posted 云逸星空科技工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nlog-动态修改DatabaseTarget,对数据库字符串进行加密相关的知识,希望对你有一定的参考价值。
private static Logger processLogger; // ① LnProcessDBLog标签 LogManager.GetLogger("LnProcessDBLog");②使用前先保证不为null,否则InitNlog();
// 修改Nlog.config配置的文件
private static void InitNlog()
LoggingConfiguration loggingConfiguration = NLog.LogManager.Configuration;
var rule = loggingConfiguration.LoggingRules.Where(a => a.LoggerNamePattern == "LnProcessDBLog")?.FirstOrDefault();
// 方式一:
//var targetDB = rule.target....FirstOrDefault() ; // 找到DatabaseTarget;不能转化为DatabaseTarget
//targetDB.con // 找不到类型且找到也不可修改,只有get属性
// 方式二:先删除再添加新的
if (rule != null)
loggingConfiguration.LoggingRules.Remove(rule); // 移除原来的DatabaseTarget配置
var logDatabase = new NLog.Targets.DatabaseTarget("LnProcessDBLog");
logDatabase.DBProvider = "System.Data.SqlClient"; // 使用的连接类库
string _connectionString = ConfigurationManager.AppSettings["DefaultConnection"]; // 加密的连接字符串
logDatabase.ConnectionString = AESEncryptHelper.Decode(_connectionString); // 解密连接字符串
logDatabase.CommandType = CommandType.Text; // 默认为CommandType.Text
logDatabase.CommandText = @"INSERT INTO [SYS_LOG_DETAILS]([LogDate],[LogThread],[LogLevel],[LogLogger],[LogMessage],[LogActionClick],[UserName],[UserIP],[LogOrder]) VALUES(@LogDate,@LogThread,@LogLevel,@LogLogger,@LogMessage,@LogActionClick,@UserName,@UserIP,@LogOrder)";
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogDate", Layout = "$event-properties:item=LogDate" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogThread", Layout = "$event-properties:item=LogThread" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogLevel", Layout = "$event-properties:item=LogLevel" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogLogger", Layout = "$event-properties:item=LogLogger" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogMessage", Layout = "$event-properties:item=LogMessage" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogActionClick", Layout = "$event-properties:item=LogActionClick" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@LogOrder", Layout = "测试" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@UserName", Layout = "$event-properties:item=UserName" );
logDatabase.Parameters.Add(new DatabaseParameterInfo() Name = "@UserIP", Layout = "$event-properties:item=UserIP" );
loggingConfiguration.AddRule(LogLevel.Trace, LogLevel.Fatal, logDatabase, "LnProcessDBLog", true); // 添加新的DatabaseTarget配置
NLog.LogManager.Configuration = loggingConfiguration; // 赋值给NLog.LogManager.Configuration。
processLogger = LogManager.GetLogger("LnProcessDBLog"); // 重新给全局变量赋值。
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/17330023.html
Luogu P1637 三元上升子序列
对于每个数$a_i$,易得它对答案的贡献为 它左边比它小的数的个数$ imes$它右边比它大的数的个数。
可以离散化后再处理也可以使用动态开点的线段树。
我使用了动态开点的线段树,只有需要用到这个节点的时候才新建这个节点,这里我是在进行修改的时候新建的。
时间复杂度$O(nlog (max
m MAX\_INT))$,空间复杂度$O(nlog (max
m MAX\_INT))$(常数真的很大)
以下是代码,不清楚的地方已标出。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 const ll MAXN = 3e4 + 5, inf = 0x7fffffffLL + 5LL; 8 9 ll ans = 0, kans[MAXN], a[MAXN], n; 10 11 struct node{ 12 13 ll data; 14 node *lc, *rc; 15 16 void pushup() { 17 data = 0; 18 if(lc) data += lc->data; 19 if(rc) data += rc->data; 20 } 21 22 node() { 23 data = 0; 24 lc = rc = NULL; 25 } 26 27 } *st1 = new node, *st2 = new node; //建立两棵线段树 28 29 ll query(node *&cur, ll l, ll r, ll ql, ll qr) { 30 if(!cur) return 0; //防止访问无效内存 31 if(ql <= l && r <= qr) { 32 return cur->data; 33 } 34 ll mid = (l + r) >> 1, ans = 0; 35 if(ql <= mid) ans += query(cur->lc, l, mid, ql, qr); 36 if(qr > mid) ans += query(cur->rc, mid + 1, r, ql, qr); 37 return ans; 38 } 39 40 void modify(node *&cur, ll l, ll r, ll q, ll k) { 41 if(!cur) cur = new node; //新建节点 42 if(l == r) cur->data += k; 43 else { 44 ll mid = (l + r) >> 1; 45 if(q <= mid) modify(cur->lc, l, mid, q, k); 46 else modify(cur->rc, mid + 1, r, q, k); 47 cur->pushup(); 48 } 49 } 50 51 void solve() { 52 for(ll i = 0; i < n; i++) { 53 kans[i] = query(st1, 1, inf, 1, a[i] - 1); //得到它左边比它小的数的个数 54 modify(st1, 1, inf, a[i], 1); 55 } 56 for(ll i = n - 1; i >= 0; i--) { 57 kans[i] *= query(st2, 1, inf, a[i] + 1, inf); //得到右边比它大的数的个数 58 modify(st2, 1, inf, a[i], 1); 59 } 60 } 61 62 int main () { 63 cin >> n; 64 for(ll i = 0; i < n; i++) cin >> a[i], a[i]+=2; //为了防止访问到0,这里直接加上2,是不改变结果的 65 solve(); 66 for(ll i = 0; i < n; i++) ans += kans[i]; 67 cout << ans << endl; 68 return 0; 69 }
以上是关于Nlog-动态修改DatabaseTarget,对数据库字符串进行加密的主要内容,如果未能解决你的问题,请参考以下文章