buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

巧用CurrentThread.Name来唯一标记一次请求的所有日志(完结篇)

▄︻┻┳═一Agenda:

▄︻┻┳═一巧用CurrentThread.Name来唯一标记一次请求的所有日志

▄︻┻┳═一巧用CurrentThread.Name来唯一标记一次请求的所有日志(续)

▄︻┻┳═一巧用CurrentThread.Name来唯一标记一次请求的所有日志(完结篇)

▄︻┻┳═一asp.net拦截器

▄︻┻┳═一巧用CurrentThread.Name来唯一标记一次请求的所有日志(java-logback篇)


 

上一篇文章《巧用CurrentThread.Name来统一标记一次请求的所有日志(续)》所述就是《巧用CurrentThread.Name来统一标记一次请求的所有日志》里改用当前线程名统一记日志后的问题。 我在csdn里也提问了(here and here),很遗憾最终没有查到原因。不过,很欣赏@sp1234大哥中肯的意见:

设计软件,面向业务来设计,例如用一个自定义的变量来保存参数。这样不管这问题中不同的过程被调用时在同一个线程还是不同线程,变量的值都是一致的。

如果“高大上”到过分技术层面,由于我们不了解技术底层和问题,所以反而弄巧成拙。

当然,我倒不是刻意在tmp1构造器里去给当前线程的Name赋值。只能说,代码改动前就是在这个构造器里声明的logflag,所以,改动时自然就在这个构造器里给当前线程赋值。 没想到,就遇到了这个问题。

至于有同学发问说,ProcessRequest里获取不到当前线程Name,是不是因为不是同一个线程了,   我倒是测试了一下, 在tmp1.ashx.cs类里声明一个私有对象,在构造器里初始化, 然后在ProcessRequest里是可以取到的。   按这个应该可以推断出是同一个线程。   所以,为什么会出现帖子里的问题,的确不好分析。

姑且留作一个思考题吧。

 

最终的解决方案就是,取代构造方法而在ProcessRequest方法里给当前线程赋值。

public abstract class HandlerBase : IHttpHandler
{
    protected readonly LogHelperUtil _LogHelperUtil;

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json"; 

        Thread.CurrentThread.Name = string.Format("[{0}_{1:HHmmssfff}_{2}]", this.GetType().Name, DateTime.Now, Guid.NewGuid().ToString().Replace("-", "").Substring(0, 5).ToUpper());
        _LogHelperUtil = new LogHelperUtil();
        
        ... ...

    }
}

 

posted on 2017-07-07 19:37  buguge  阅读(301)  评论(0编辑  收藏  举报