▄︻┻┳═一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. .NET Core开发日志——Model Binding

    ASP.NET Core MVC中所提供的Model Binding功能简单但实用,其主要目的是将请求中包含的数据映射到action的方法参数中.这样就避免了开发者像在Web Forms时代那样需要从 ...

  2. 泡泡一分钟:Towards real-time unsupervised monocular depth estimation on CPU

    Towards real-time unsupervised monocular depth estimation on CPU Matteo Poggi , Filippo Aleotti , Fa ...

  3. SQL Server 2012 安装过程详解(包含每一步设置的含义)

    转http://www.cnblogs.com/EastLiRoar/p/4051969.html 一.启动安装程序,点击“安装”选项卡,选择“全新SQL Server独立安装或向现有安装添加功能”. ...

  4. git 错误 fatal: Not a valid object name: 'master'

    问题场景:新建git项目或刚为已存在项目创建了git仓库,想用git branch dev创建dev分支或用git checkout -b dev创建并切换到dev分支时报错. 原因:刚创建的git仓 ...

  5. [administrative] windows 下制作USB启动盘的工具

    arch魔教的文档:  https://wiki.archlinux.org/index.php/USB_flash_installation_media windows 下的 dd: https:/ ...

  6. Visio 画图

    流程图 圆角矩形表示"开始"与"结束" 矩形表示行动方案.普通工作环节用 菱形表示问题判断或判定(审核/审批/评审)环节 平行四边形表示输入输出 箭头代表工作流 ...

  7. ubuntu物理机上搭建Kubernetes集群 -- minion 配置

    1. flannel配置 下载二进制文件 https://github.com/coreos/flannel/releases 版本:flannel-v0.7.0-linux-amd64.tar.gz ...

  8. java 线程(六)死锁

    package cn.sasa.demo4; public class ThreadDemo { public static void main(String[] args){ DeadLockRun ...

  9. 修改.net core MVC默认端口

    默认端口是5000,更改端口修改launchSettings.json.如图:

  10. 洛谷P2303 [SDOi2012] Longge的问题 数论

    看懂了题解,太妙了TT但是想解释的话可能要很多数学公式打起来太麻烦了TT所以我就先只放代码具体推演的过程我先写在纸上然后拍下来做成图片放上来算辣quq 好的那我先滚去做题了做完这题就把题解放上来.因为 ...