2015-12-26 93 views
0

我正在使用logstash-logback-encoder以json格式打印日志。使用logback和logstash-logback编码器自定义日志级别显示

logback.xml看起来象下面这样: -

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
      <includeContext>false</includeContext> 
      <fieldNames> 
       <timestamp>timestamp</timestamp> 
       <version>[ignore]</version> 
       <levelValue>[ignore]</levelValue> 
      </fieldNames> 
     </encoder> 
    </appender> 
    <appender name="stash" 
     class="ch.qos.logback.core.rolling.RollingFileAppender">   
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>/tmp/SolrUpdater.%d{yyyy-MM-dd}.log 
      </fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
     <encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
      <includeContext>false</includeContext> 
      <fieldNames> 
       <timestamp>timestamp</timestamp> 
       <version>[ignore]</version> 
       <levelValue>[ignore]</levelValue> 
      </fieldNames> 
     </encoder> 
    </appender> 
    <root level="error"> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="stash" /> 
    </root> 
</configuration> 

有人可以让我知道我可以用小写显示所有levelerror,而不是默认的ERRORWARNwarning

UPDATE - 我创建了一个CustomLogLevelJsonProvider的建议通过Zakhar: -

package com.jabong.discovery.importer.solrUpdater.log; 

public class CustomLogLevelJsonProvider extends LogLevelJsonProvider { 
    final static String DEBUG = "debug"; 
    final static String ERROR = "error"; 
    final static String INFO = "info"; 
    final static String WARNING = "warning"; 

    @Override 
    public void writeTo(JsonGenerator generator, ILoggingEvent event) 
     throws IOException { 
    JsonWritingUtils.writeStringField(generator, getFieldName(), 
     getCustomLogLevel(event)); 
    } 

    private String getCustomLogLevel(ILoggingEvent event) { 
    if (event.getLevel() == Level.ALL) { 
     return Level.ALL.toString(); 
    } 
    if (event.getLevel() == Level.DEBUG) { 
     return DEBUG; 
    } 
    if (event.getLevel() == Level.ERROR) { 
     return ERROR; 
    } 
    if (event.getLevel() == Level.INFO) { 
     return INFO; 
    } 
    if (event.getLevel() == Level.WARN) { 
     return WARNING; 
    } 
    return ""; 
    } 
} 

更新logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder class="com.jabong.discovery.importer.solrUpdater.log.CustomEncoder"> 
      <includeContext>false</includeContext> 
      <fieldNames> 
       <timestamp>timestamp</timestamp> 
       <version>[ignore]</version> 
       <levelValue>[ignore]</levelValue> 
      </fieldNames> 
     </encoder> 
    </appender> 
    <appender name="FILE" 
     class="ch.qos.logback.core.rolling.RollingFileAppender">   
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>/tmp/SolrUpdater.%d{yyyy-MM-dd}.log 
      </fileNamePattern> 
      <maxHistory>7</maxHistory> 
     </rollingPolicy> 
     <encoder class="net.logstash.logback.encoder.LogstashEncoder"> 
      <includeContext>false</includeContext> 
      <fieldNames> 
       <timestamp>timestamp</timestamp> 
       <version>[ignore]</version> 
       <levelValue>[ignore]</levelValue> 
      </fieldNames> 
     </encoder> 
    </appender> 
    <root level="error"> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE" /> 
    </root> 
</configuration> 

现在我看了两眼level: -

{"timestamp":"2015-12-26T23:41:08.818+05:30","message":"Partial Updater Initialization Failed ","logger_name":"com.jabong.discovery.importer.solrUpdater.partialupdate.PartialUpdater","thread_name":"main","level":"ERROR","stack_trace":"java.lang.Exception: Failed to Connect to SolrIndex Type:solr, Core:discovery, Host:localhost, Port:8888\n\tat com.jabong.discovery.importer.solrUpdater.partialupdate.PartialUpdater.initIndexUpdater(PartialUpdater.java:83) [classes/:na]\n\tat com.jabong.discovery.importer.solrUpdater.partialupdate.PartialUpdater.initialise(PartialUpdater.java:36) [classes/:na]\n\tat com.jabong.discovery.importer.solrUpdater.partialupdate.PartialUpdater.<init>(PartialUpdater.java:30) [classes/:na]\n\tat Updater.initialise(Updater.java:50) [classes/:na]\n\tat Updater.main(Updater.java:70) [classes/:na]\n","level":"error"} 

回答

3

我做n不知道这是否可以通过XML进行配置。但我只是试图覆盖你不喜欢的行为。 您将需要实施两个新类。

1)

public class CustomEncoder extends LogstashEncoder { 
    public CustomEncoder() { 
     LoggingEventJsonProviders providers = getFormatter().getProviders(); 

     // Remove provider that is responsible for log level appending 
     removeDefaultProvider(providers); 

     // Register our implementation 
     providers.addLogLevel(new CustomLogLevelJsonProvider()); 
    } 

    private void removeDefaultProvider(LoggingEventJsonProviders providers) { 
     JsonProvider<ILoggingEvent> providerToDelete = null; 

     for (JsonProvider<ILoggingEvent> provider : providers.getProviders()) { 
      if (provider instanceof LogLevelJsonProvider) { 
       providerToDelete = provider; 
       break; 
      } 
     } 

     providers.removeProvider(providerToDelete); 
    } 
} 

2)

public class CustomLogLevelJsonProvider extends LogLevelJsonProvider { 
    @Override 
    public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException { 
     JsonWritingUtils.writeStringField(
       generator, getFieldName(), event.getLevel().toString().toLowerCase()); 
    } 
} 

3) 启用配置新的编码器。

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder class="com.test.encoder.CustomEncoder"> 
     <includeContext>false</includeContext> 
     <fieldNames> 
      <timestamp>timestamp</timestamp> 
      <version>[ignore]</version> 
      <levelValue>[ignore]</levelValue> 
     </fieldNames> 
    </encoder> 
</appender> 

更新: 您已经更新了你的问题。您需要一些额外的逻辑来转换WARN或警告警告。由于这会发生在每个日志消息上,这会产生开销。 您想要更改的值在课程中是硬编码的:ch.qos.logback.classic.Level

+0

您还可以让我知道我必须放置这些自定义类的位置吗? – tuk

+0

在你的类路径中。例如,在您的项目中。 – Zakhar

+0

我尝试了你的solurtion,但现在我看到两个'level'。一个值为'ERROR',另一个'错误'。 – tuk

相关问题