巧用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又是个什么东东呢 ...
随机推荐
- Writable序列化
序列化:将内存中的对象 转换成字节序列以便于存储在磁盘上或者用于网络传输. 反序列化:将磁盘或者从网络中接受到的字节序列,装换成内存中的对象. 自定义bean对象(普通java对象)要想序列化传输,必 ...
- LeetCode 11 - 盛最多水的容器 - [双指针暴力]
题目链接:https://leetcode-cn.com/problems/container-with-most-water/description/ 给定 n 个非负整数 $a_1,a_2,\cd ...
- git add详解
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件. git add -u :他仅监控 ...
- Linux 配置SFTP,配置用户访问权限
之前我服务器是使用的Windows Server 2003,这段时间由于访问量变大我还是机智的换成Linux了,在搭建FTP的时候看到网上都是推荐vsftpd,不过我不推荐这个家伙,看官且看下文. 我 ...
- 2016年蓝桥杯省赛A组c++第4题(算法填空)
/* 排序在各种场合经常被用到. 快速排序是十分常用的高效率的算法. 其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它. 这样,排序问题 ...
- iOS,添加阴影
self.layer.shadowOpacity = 0.5f; // 0.8深 0.3淡 shadowOpacity数值越大,阴影越浓
- 制作STM32开发板要买的电子元器件
1.STM32F103VET6芯片 2.电阻(10K.1.5K.1K.510R.47R.27R.0R) 3.电容(104.4.7uf.1uf.22uf.10pf.) 4.二极管(普通二极管D1206. ...
- navicat连接oracle失败
正常是成功的,失败的话,就是oci.dll的问题 在这边下载: https://www.oracle.com/technetwork/topics/winsoft-085727.html 然后找到对应 ...
- python作用域问题
今天出了个低级的错误,最后确定是作用域问题,特回顾知识点如下: 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. Python的作 ...
- log4j layout日志信息格式
Log4j提供的layout有以下几种 org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定 ...