巧用CurrentThread.Name来统一标识日志记录(续)
▄︻┻┳═一Agenda:
▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录
▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续)
▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(完结篇)
▄︻┻┳═一asp.net拦截器
▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(java-logback篇)
开篇不提前文。本文通过模拟场景来抛出问题。
我在web站点程序里新建一个tmp1.ashx文件。其类代码如下:
using System;
using System.IO;
using System.Threading;
using System.Web; namespace PaymentPlatform.Test
{
/// <summary>
/// tmp1 的摘要说明
/// </summary>
public class tmp1 : IHttpHandler
{
public tmp1()
{
Thread.CurrentThread.Name = string.Format("[{0}]", Guid.NewGuid().ToString().Replace("-", "").ToUpper()); WriteLog("=========");
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
WriteLog("ProcessRequest");
context.Response.Write(""); } private static void WriteLog(string log)
{
string logFileName = string.Format("{0:yyyyMMdd}-{1}.txt", DateTime.Now, "Info");
logFileName = Path.Combine(System.Configuration.ConfigurationManager.AppSettings["logPath"], logFileName);
log = (System.Threading.Thread.CurrentThread.Name ?? "null") + log;
using (StreamWriter sw = new StreamWriter(logFileName, true))
{
sw.WriteLine(log);
sw.Close();
}
} public bool IsReusable
{
get {return false; }
}
}
}
注意,我在tmp1的构造方法里给当前线程的Name属性赋值。在后续包括ProcessRequest方法里记日志时,会获取当前线程Name并打印出来。
我做了如下几种测试:
- ie里访问tmp1.ashx,包括频繁刷新,所记录的日志都可以获取到当前线程Name。
- 构造Method为Get的HttpWebRequest请求,并发测试,所记录的日志都可以获取到当前线程Name。
- 构造Method为Post的HttpWebRequest请求,在不传递参数(ContentLength=0)的情况下,并发测试,发现所记录的日志都可以获取到当前线程Name。
- 构造Method为Post的HttpWebRequest请求,在传递参数的情况下,并发测试,发现所记录的日志都无法获取到当前线程Name。
测试用例代码如下:
using CommonUtils;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading; namespace Test.TechArt
{
[TestClass]
public class HttpPostTest
{
[TestMethod]
public void ConcurrentTest()
{
for (int j = ; j < ; j++)
{
CallASHXAPI();
} List<Thread> list = new List<Thread>();
for (int i = ; i < ; i++)
{
list.Add(new Thread(() =>
{
for (int j = ; j < ; j++)
{
CallASHXAPI();
}
}));
}
list.AsParallel().ForAll(t => t.Start());
Thread.Sleep();
} [TestMethod]
public void CallASHXAPI()
{ string requestUrl = "http://localhost:8076/Test/tmp1.ashx"; string ret = RequestUrlPost(requestUrl);
LogHelper.Write("响应报文:" + ret); } private string RequestUrlGet(string requestUrl)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
using (var reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
private string RequestUrlPost(string requestUrl)
{
/*
有参和无参,会导致两种结果
*/
//无参,在tmp1.ashx的ProcessRequest的方法里记录的日志可以获取到当前线程的Name
//string requestMsg = "";
//有参,在tmp1.ashx的ProcessRequest的方法里记录的日志都获取不到当前线程的Name
string requestMsg = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.Method = "POST"; byte[] aryBuf = Encoding.UTF8.GetBytes(requestMsg);
request.ContentLength = aryBuf.Length; using (Stream writer = request.GetRequestStream())
{
writer.Write(aryBuf, , aryBuf.Length);
writer.Close();
writer.Dispose();
}
using (var reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
}
}
由此,问题来了,Http流请求传参和不传参这两种情况有什么区别呢?
巧用CurrentThread.Name来统一标识日志记录(续)的更多相关文章
- 巧用CurrentThread.Name来统一标识日志记录(java-logback篇)
▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...
- 巧用CurrentThread.Name来统一标识日志记录(完结篇)
▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...
- 巧用CurrentThread.Name来统一标识日志记录
▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...
- slf4j+log4j在Java中实现日志记录
小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...
- 用slf4j统一管理日志总结
用slf4j统一管理日志总结 参考网页:http://www.slf4j.org/ 一.使用slf4j统一管理并配置统一使用log4j日志 使用的jar:(slf4j-api-1.7.5.jar,jc ...
- Flunetd 用于统一日志记录层的开源数据收集器
传统的日志查看方式 使用fluentd之后 一.介绍 Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据. 几大特色: 使用JSON统一记录 简单灵活可插拔架构 ...
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- SLF4J - 一个允许你统一日志记录API的抽象层
一.什么是SLF4J 我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如: java.util.logging Apache log4j logback SLF4J又是个什么东东呢 ...
随机推荐
- hdu6330 多校3 L 画一个cube
http://acm.hdu.edu.cn/showproblem.php?pid=6330 技巧:循环变量要选1~A,然后把公式写下标里.会快很多 #define _CRT_SECURE_NO_WA ...
- iOS引用类型
强引用, 默认引用类型.被强引用指向的内存不被释放.强引用会对被引用对象的引用计数器+1,从而扩展对象的生命周期. 弱引用, 弱引用是医用特殊的引用类型.它不会增加引用计数器,因而不会扩展对象的生命周 ...
- flume 学习总结
flume 总结 flume 总结 下载配置安装 1 下载 2 配置安装 flume 架构 agent 配置 1 source 配置 11 监听网络端口 12 监控文件 2 channel 配置 3 ...
- Quick access recorder
QAR_百度百科 https://baike.baidu.com/item/QAR/3300914
- DevExpress前端组件库
适用于为.Net环境(也有dephi版本,其他环境未知)下 WinForm\WebForm\ASP MVC的前端扩展组件,帮助生成高度windows office统一风格的界面. 在winform下, ...
- 自己写的JdbcUtils小工具-----得到Connection对象
Properties文件中存放键值对------(可看对Properties文件的解析) static代码块是在构造函数之前执行的,而且只执行一次,即类首次加载时. 也就是只加载一次配置文件和加载数据 ...
- winform窗体启动过程
窗体启动执行顺序:FormShowFormPaintFormActivateFormResize 关闭窗体过程FormCloseFormDestroy 最小化再最大化:FormPaintFormRes ...
- 安装graphlab伤透了心,终于搞定了
为了方便研究各种机器学习算法,我想用graphlab来辅助我对后续算法的研究.所以我的目标就是安装graphlab到我的windows笔记本中.而基于python的graphlab的安装最好是采用如下 ...
- kmeans笔记
1.算法过程 a.随机选取k个初始点作为中心点 b.依次计算剩余所有点分别与哪个初始点距离较近,则该点属于哪个簇 c.移动中心点到现在的簇的中心 d.重复b,c两步,直到中心点不再变化算法结束 2.优 ...
- UVA11491 奖品的价值
奖品的价值C804 运行时间限制:1000ms: 运行空间限制:51200KB 试题描述 你是一个电视节目的获奖嘉宾.主持人在黑板上写出一个 n 位非负整数(不以 0 开头),邀请你删除其中的 d 个 ...