▄︻┻┳═一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来统一标识日志记录(续)的更多相关文章

  1. 巧用CurrentThread.Name来统一标识日志记录(java-logback篇)

    ▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...

  2. 巧用CurrentThread.Name来统一标识日志记录(完结篇)

    ▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...

  3. 巧用CurrentThread.Name来统一标识日志记录

    ▄︻┻┳═一Agenda: ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录 ▄︻┻┳═一巧用CurrentThread.Name来统一标识日志记录(续) ▄︻┻┳═一巧用Cur ...

  4. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  5. 用slf4j统一管理日志总结

    用slf4j统一管理日志总结 参考网页:http://www.slf4j.org/ 一.使用slf4j统一管理并配置统一使用log4j日志 使用的jar:(slf4j-api-1.7.5.jar,jc ...

  6. Flunetd 用于统一日志记录层的开源数据收集器

    传统的日志查看方式 使用fluentd之后 一.介绍 Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据. 几大特色: 使用JSON统一记录 简单灵活可插拔架构 ...

  7. Spring Boot AOP 扫盲,实现接口访问的统一日志记录

    AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  9. SLF4J - 一个允许你统一日志记录API的抽象层

    一.什么是SLF4J 我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如: java.util.logging Apache log4j logback SLF4J又是个什么东东呢 ...

随机推荐

  1. Oracle分析函数大全

    分析函数又叫开窗函数,OLAP函数等,因为有人问我用过开窗函数没,呵,什么是开窗函数,从来没听过,难道是分析函数么.哈哈,最后还真是分析函数哦!用过的东西别名也应该知道,赶上这么个事,就剽窃一眼Ora ...

  2. rabbitmq集群部署及配置

    消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步.本篇将以rabbitmq+HA方式进行部署. 一.原理介绍 rabbitmq是依据erlang的分 ...

  3. zookeeper 杂记

    Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M.

  4. 过滤器会拦截 前端页面加载 js文件的请求

    学艺不精啊.....之前就总结过博客: JAVA中解决Filter过滤掉css,js,图片文件等问题 结果现在又犯了老错误~ 情况如下: index.jsp 页面的验证码输入栏绑定了异步验证(jQur ...

  5. 内部排序->选择排序->堆排序

    文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左.右孩子结点的值.由此,若序列{k1, k2, …, kn}是堆,则堆顶元素(或完全二叉树 ...

  6. winform窗体启动过程

    窗体启动执行顺序:FormShowFormPaintFormActivateFormResize 关闭窗体过程FormCloseFormDestroy 最小化再最大化:FormPaintFormRes ...

  7. Java之旅_高级教程_多线程编程

    摘自:http://www.runoob.com/java/java-multithreading.html Java 多线程编程 Java 给多线程编程提供了内置的支持.一条线程指的是进程中的一条执 ...

  8. TMS WEB Core v1.2预览版:新的Electron应用程序支持

    2019年2月20日,星期三 几个月前,我们已经开始与Electron进行实验.在工作概念验证之后,我们的目标是为Delphi开发人员尽可能多地包装Electron API.但当然不仅仅是可以使用的E ...

  9. java 之程序中的http请求

    背景 java程序中有时需要我们发起http级别的请求,例如抓数据或者第三方对接时,一般分为两种:一种是只需我们发起请求,还有一种是我们不但要发起请求,还要拿到请求后的数据来进行下一步处理 实现 针对 ...

  10. panda核心数据结构

    Series Series是一维带标签的数组,数组里可以放任意的数据(整数.浮点数.字符串.python Object)等等 创建函数: (1)s = pd.Series(data,index=ind ...