[logback-dev] [JIRA] Created: (LBCLASSIC-126) NDC implementation

Anders Wallgren (JIRA) noreply-jira at qos.ch
Fri May 8 23:54:10 CEST 2009


NDC implementation
------------------

                 Key: LBCLASSIC-126
                 URL: http://jira.qos.ch/browse/LBCLASSIC-126
             Project: logback-classic
          Issue Type: New Feature
    Affects Versions: 0.9.15
            Reporter: Anders Wallgren
            Assignee: Logback dev list
         Attachments: NDC.java

The discussion about NDC vs. MDC has been done going for quite a while. I don't think MDC is a suitable replacement for NDC, except insofar as NDC can be implemented using MDC.

Enclosed is the NDC implementation we're started using at Electric Cloud. Please feel free to adapt/modify/enhance it as you see fit. We place this code in the public domain in case others find it useful.

Attachment to come as well.


// NDC.java --
//
// NDC.java is part of the ElectricCommander server.
//
// Copyright (c) 2005-2009 Electric Cloud, Inc.
// All rights reserved.
//

package com.electriccloud.log;

import java.util.Deque;
import java.util.LinkedList;

import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

import org.slf4j.MDC;

/**
 * Utility object that implements NDC using MDC.
 */
@SuppressWarnings({"UtilityClass", "StringContatenationInLoop"})
public class NDC
{

    //~ Static fields/initializers ---------------------------------------------

    private static final ThreadLocal<Deque<String>> s_stack =
        new ThreadLocal<Deque<String>>() {
            @Override @SuppressWarnings({"RefusedBequest"})
            protected Deque<String> initialValue()
            {
                return new LinkedList<String>();
            }
        };

    //~ Constructors -----------------------------------------------------------

    private NDC()
    {
    }

    //~ Methods ----------------------------------------------------------------

    public static void pop()
    {
        Deque<String> stack = s_stack.get();

        // Pop the stack if isn't already empty
        if (!stack.isEmpty()) {
            stack.pop();
        }

        // Put the previous value in the MDC (null if the stack is now empty)
        MDC.put("NDC", stack.peek());
    }

    @SuppressWarnings({"HardCodedStringLiteral"})
    public static void push(@NonNls @NotNull String format, Object... args)
    {
        Deque<String> stack    = s_stack.get();
        String        previous = stack.peek();
        String        segment  = args.length == 0
            ? format
            : String.format(format, args);
        String        newValue = previous == null
            ? segment
            : String.format("%s %s", previous, segment);

        stack.push(newValue);
        MDC.put("NDC", newValue);
    }
}


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the logback-dev mailing list