2016-04-26 4 views
11

मैं निम्नलिखित logback पैटर्न:प्रक्रिया आईडी Logback लॉगिंग पैटर्न में

<pattern> 
    {"hostname": "${HOSTNAME}", 
    "level": "%p", 
    "method": "%M", 
    "process_id": "${process}", 
    "thread_id": "%t", 
    "timestamp": "%d{Y-M-d}T%d{H:M:S.s}", 
    "mesg":"%msg"}%n 
</pattern> 

दुर्भाग्य से जब लॉग संदेशों वास्तव में उत्पन्न कर रहे हैं मैं देख रहा हूँ: "process_id": "process_IS_UNDEFINED"

वहाँ प्रक्रिया आईडी, इस तरह के किसी भी स्वचालित रूप से सेट चर है जैसा कि होस्टनाम के लिए है? मुझे लॉगबैक दस्तावेज़ीकरण में ऐसे स्वचालित रूप से सेट चरों की एक दस्तावेजी सूची खोजने में बहुत परेशानी हो रही है, क्या किसी को बेहतर दस्तावेज़ स्रोत के बारे में पता है?

संपादित करें: मुझे मैप किए गए डायग्नोस्टिक संदर्भों के बारे में पता है, लेकिन एक ऐसे बिल्टिन समाधान की उम्मीद कर रहा था जिसे इस तरह के सेटअप की आवश्यकता नहीं है, जैसे होस्टनाम कैसे काम करता है।

उत्तर

13

आप Mapped Diagnostic Context साथ अपनी समस्या को हल कर सकते हैं

<pattern>{..., "process_id": "%X{process_id}"}</pattern> 

संपादित इसके अलावा, आप अपना खुद का एन्कोडर और कनवर्टर बना सकते हैं और उन्हें logback.xml में उपयोग कर सकते हैं:

import ch.qos.logback.classic.PatternLayout; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 

public class ExtendedPatternLayoutEncoder extends PatternLayoutEncoder { 
    @Override 
    public void start() { 
     // put your converter 
     PatternLayout.defaultConverterMap.put(
      "process_id", ProcessIdConverter.class.getName()); 
     super.start(); 
    } 
} 
import ch.qos.logback.classic.pattern.ClassicConverter; 
import ch.qos.logback.classic.spi.ILoggingEvent; 

import java.lang.management.ManagementFactory; 

public class ProcessIdConverter extends ClassicConverter { 
    private static final String PROCESS_ID = 
      ManagementFactory.getRuntimeMXBean().getName(); 

    @Override 
    public String convert(final ILoggingEvent event) { 
     // for every logging event return processId from mx bean 
     // (or better alternative) 
     return PROCESS_ID; 
    } 
} 
<encoder class="some.package.ExtendedPatternLayoutEncoder"> 
    <pattern>{..., "process_id": "%process_id"}</pattern> 
</encoder> 
+0

यह एक समाधान है जिसे मैं जानता था, लेकिन यह कष्टप्रद है क्योंकि इसे हमारे वास्तविक कोड को संशोधित करने की आवश्यकता है। क्या आवेदन कोड को संशोधित करने के बाहर एमडीसी स्थापित करने के लिए वैसे भी है? शायद एक अलग वर्ग लिखकर जो एमडीसी को संशोधित करता है और उसे कक्षा पथ पर डालता है? – qwwqwwq

+0

@qwwqwwq मुझे यकीन नहीं है कि ऐसा करने के लिए कुछ दस्तावेज तरीका है या नहीं। मुझे लगता है कि आप 'ch.qos.logback.classic.PatternLayoutBase' वर्ग को ओवरराइड कर सकते हैं और अपना कनवर्टर' डिफ़ॉल्ट कनवर्टरमैप 'में डाल सकते हैं। लेकिन यह एक गंदा हैक :) – vsminkov

+0

@qwwqwwq एक और तरीका है। आप वास्तव में 'ch.qos.logback.classic.PatternLayout' से प्राप्त कर सकते हैं और इसे अपने logback.xml जैसे [यहां] (http://logback.qos.ch/manual/layouts.html) में उपयोग कर सकते हैं। – vsminkov

-2

हो सकता है कि आप प्रक्रिया के बजाय % थ्रेड आज़माएं। इस प्रकार

import org.slf4j.MDC; 

public class Main { 
    public static void main(String... args) { 
     // put process ID early 
     MDC.put("process_id", 
      ManagementFactory.getRuntimeMXBean().getName()); 
    } 
} 

कि आप सभी की जरूरत के बाद किया जाता है अपने पैटर्न को फिर से परिभाषित करने के लिए:

+0

धन्यवाद, मैं पहले से ही धागा आईडी होना , लेकिन प्रक्रिया आईडी की तलाश में हूँ। – qwwqwwq

1

वहाँ @vsminkov की तुलना में एक बेहतर समाधान है। मुझे यह मिला: Layouts, यह कहता है एक कस्टम रूपांतरण विनिर्देशक बनाना। मूल रूप से आप अपने कनवर्टर बनाने के लिए, लेकिन इसके बजाय PatternLayoutEncoder विस्तार की आप अपनी कॉन्फ़िगरेशन में एक रूपांतरण नियम जोड़ने:

<configuration> 

    <conversionRule conversionWord="pid" 
        converterClass="my.custom.converter.ProcessIdConverter" /> 
    <conversionRule conversionWord="processId" 
        converterClass="my.custom.converter.ProcessIdConverter" /> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%-6pid [%thread] - %msg%n</pattern> 
    </encoder> 
    </appender> 
    ... 
</configuration> 

इस तरह आप प्रतिक्रिया के लिए एनकोडर से छुटकारा पाने के

संबंधित मुद्दे