2016-04-26 15 views
11

Aşağıdaki logback desen var:Süreç Kimliği Logback Günlüğü Örneği'ne

"process_id": "process_IS_UNDEFINED" işlem kimliği, böyle herhangi otomatik olarak ayarlanır değişken var: kayıt mesajları aslında zaman üretilir

<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> 

Maalesef Görüyorum hostname için olduğu gibi? Logback belgelerinde otomatik olarak ayarlanmış değişkenlerin belgelenmiş bir listesini bulmakta çok fazla sorun yaşıyorum, daha iyi bir dokümantasyon kaynağını bilen var mı?

Düzenleme: Mapped Diagnostic Contexts öğesinin farkındayım, ancak ana makine adının çalıştığı gibi, bu tür bir kuruluma ihtiyaç duymayan yerleşik bir çözüm olmasını umuyordu.

cevap

13

Sen Mapped Diagnostic Context ile sorununuzu çözebilir

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

size Ayrıca

DÜZENLENMİŞ kendi kodlayıcı ve dönüştürücünüzü oluşturabilir ve bunları logback.xml:

'da kullanabilir
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

Bu, farkında olduğum bir çözümdür, ancak gerçek kodumuzu değiştirmeyi gerektirdiği için can sıkıcıdır. Uygulama kodunu değiştirmek dışında MDC'yi kurmak zaten var mı? Belki MDC'yi değiştiren ve bunu sınıf yoluna koyan ayrı bir sınıf yazarak? – qwwqwwq

+0

@qwwqwwq Bunu yapmak için belgelenmiş bir yol olup olmadığından emin değilim. Sanırım ch.qos.logback.classic.PatternLayoutBase 'sınıfını geçersiz kılabilir ve dönüştürücünüzü 'defaultConverterMap''e koyabilirsiniz. Ama bu kirli bir hack :) – vsminkov

+0

@qwwqwwq Başka bir yolu var. Aslında ch.qos.logback.classic.PatternLayout' öğesinden devralınabilir ve logback.xml dosyasında [here] (http://logback.qos.ch/manual/layouts.html) gibi kullanabilirsiniz. – vsminkov

-2

Proses yerine % thread deneyebilirsiniz. aşağıdaki gibi Kalıbınızı yeniden tanımlamak için tüm ihtiyacınız sonra

import org.slf4j.MDC; 

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

edilir:

+0

Teşekkür kurtulmak Bu şekilde, zaten iplik kimliğe sahip ama işlem kimliğini arıyorum. – qwwqwwq

1

@vsminkov daha iyi bir çözüm yoktur . Ben burada bulundu: özel bir dönüşüm belirteci oluşturma diyorlardı Layouts. Temelde size dönüştürücü oluşturmak, ancak bunun yerine PatternLayoutEncoder uzanan size yapılandırmasına bir dönüşüm kuralı ekleyin:

<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> 

Eğer yanıt için enkoderin