You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2021/02/10 01:43:50 UTC

[lucene-solr] 06/09: @1333 More cleanup and correctness.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 132fd422a4165e0fe2884d5f0e8000f0384d087e
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Feb 4 14:00:26 2021 -0600

    @1333 More cleanup and correctness.
    
    # Conflicts:
    #	versions.props
---
 solr/core/build.gradle                             |   1 +
 .../processor/LogUpdateProcessorFactory.java       |   2 +-
 solr/server/resources/log4j2.xml                   |  31 ++--
 .../org/apache/solr/common/util/NamedList.java     | 198 +++++++++++----------
 .../src/resources/logconf/log4j2-std-debug.xml     |   7 +-
 versions.props                                     |   3 +-
 6 files changed, 131 insertions(+), 111 deletions(-)

diff --git a/solr/core/build.gradle b/solr/core/build.gradle
index 011a374..6098be9 100644
--- a/solr/core/build.gradle
+++ b/solr/core/build.gradle
@@ -96,6 +96,7 @@ dependencies {
   implementation 'org.apache.logging.log4j:log4j-api'
   implementation 'org.apache.logging.log4j:log4j-core'
   implementation 'org.apache.logging.log4j:log4j-slf4j-impl'
+  implementation 'com.vlkan.log4j2:log4j2-logstash-layout'
 
   api 'org.bitbucket.b_c:jose4j'
   implementation 'org.codehaus.janino:commons-compiler'
diff --git a/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java
index 5f299c9..2be93c3 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/LogUpdateProcessorFactory.java
@@ -62,7 +62,7 @@ public class LogUpdateProcessorFactory extends UpdateRequestProcessorFactory imp
 
   @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next) {
-    return (log.isDebugEnabled() || slowUpdateThresholdMillis >= 0 || Boolean.getBoolean("solr.logUpdateProcOnInfo")) ?
+    return (log.isInfoEnabled() || slowUpdateThresholdMillis >= 0) ?
         new LogUpdateProcessor(req, rsp, this, next) : next;
   }
   
diff --git a/solr/server/resources/log4j2.xml b/solr/server/resources/log4j2.xml
index 411de14..03a5c06 100644
--- a/solr/server/resources/log4j2.xml
+++ b/solr/server/resources/log4j2.xml
@@ -21,22 +21,20 @@
   <Appenders>
 
     <Console name="STDOUT" target="SYSTEM_OUT">
-      <PatternLayout>
-        <Pattern>
-          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{node_name} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
-        </Pattern>
-      </PatternLayout>
+      <LogstashLayout dateTimeFormatPattern="yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"
+                      eventTemplateUri="classpath:LogstashJsonEventLayoutV1.json"
+                      prettyPrintEnabled="true"
+                      stackTraceEnabled="true"/>
     </Console>
 
     <RollingRandomAccessFile
         name="MainLogFile"
         fileName="${sys:solr.log.dir}/solr.log"
         filePattern="${sys:solr.log.dir}/solr.log.%i" >
-      <PatternLayout>
-        <Pattern>
-          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{node_name} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
-        </Pattern>
-      </PatternLayout>
+      <LogstashLayout dateTimeFormatPattern="yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"
+                      eventTemplateUri="classpath:LogstashJsonEventLayoutV1.json"
+                      prettyPrintEnabled="true"
+                      stackTraceEnabled="true"/>
       <Policies>
         <OnStartupTriggeringPolicy />
         <SizeBasedTriggeringPolicy size="64 MB"/>
@@ -48,11 +46,10 @@
         name="SlowLogFile"
         fileName="${sys:solr.log.dir}/solr_slow_requests.log"
         filePattern="${sys:solr.log.dir}/solr_slow_requests.log.%i" >
-      <PatternLayout>
-        <Pattern>
-          %maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{node_name} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
-        </Pattern>
-      </PatternLayout>
+      <LogstashLayout dateTimeFormatPattern="yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"
+                      eventTemplateUri="classpath:LogstashJsonEventLayoutV1.json"
+                      prettyPrintEnabled="true"
+                      stackTraceEnabled="true"/>
       <Policies>
         <OnStartupTriggeringPolicy />
         <SizeBasedTriggeringPolicy size="32 MB"/>
@@ -67,10 +64,12 @@
     <AsyncLogger name="org.eclipse.jetty" level="WARN"/>
     <AsyncLogger name="org.eclipse.jetty.server.Server" level="WARN"/>
     <AsyncLogger name="org.apache.hadoop" level="WARN"/>
-    <AsyncLogger name="org.apache.solr.update.LoggingInfoStream" level="OFF"/>
     <AsyncLogger name="org.apache.zookeeper" level="WARN"/>
     <AsyncLogger name="org.apache.zookeeper.ClientCnxn" level="ERROR"/>
     <AsyncLogger name="org.apache.zookeeper.server.ZooKeeperCriticalThread" level="OFF"/>
+
+    <AsyncLogger name="org.apache.solr.update.processor.LogUpdateProcessorFactory" level="DEBUG"/>
+    <AsyncLogger name="org.apache.solr.update.LoggingInfoStream" level="OFF"/>
     <AsyncLogger name="org.apache.solr.core.SolrCore.SlowRequest" level="INFO" additivity="false">
       <AppenderRef ref="SlowLogFile"/>
     </AsyncLogger>
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java b/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
index a05ffbc..3aabf32 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
@@ -182,7 +182,13 @@ public class NamedList<T> implements Cloneable, Serializable, Iterable<Map.Entry
    * @return null if no name exists
    */
   public String getName(int idx) {
-    return (String)nvPairs.get(idx << 1);
+    Object name = null;
+    try {
+      name = nvPairs.get(idx << 1);
+      return (String) name;
+    } catch (ClassCastException e) {
+      return String.valueOf(name);
+    }
   }
 
   /**
@@ -422,96 +428,7 @@ public class NamedList<T> implements Cloneable, Serializable, Iterable<Map.Entry
     return asShallowMap(false);
   }
   public Map<String,T> asShallowMap(boolean allowDps) {
-    return new Map<String, T>() {
-      @Override
-      public int size() {
-        return NamedList.this.size();
-      }
-
-      @Override
-      public boolean isEmpty() {
-        return size() == 0;
-      }
-
-      public boolean containsKey(Object  key) {
-        return NamedList.this.get((String) key) != null ;
-      }
-
-      @Override
-      public boolean containsValue(Object value) {
-        return false;
-      }
-
-      @Override
-      public T get(Object key) {
-        return  NamedList.this.get((String) key);
-      }
-
-      @Override
-      public T put(String  key, T value) {
-        if (allowDps) {
-          NamedList.this.add(key, value);
-          return null;
-        }
-        int idx = NamedList.this.indexOf(key, 0);
-        if (idx == -1) {
-          NamedList.this.add(key, value);
-        } else {
-          NamedList.this.setVal(idx, value);
-        }
-        return null;
-      }
-
-      @Override
-      public T remove(Object key) {
-        return  NamedList.this.remove((String) key);
-      }
-
-      @Override
-      @SuppressWarnings({"unchecked"})
-      public void putAll(Map m) {
-        boolean isEmpty = isEmpty();
-        for (Object o : m.entrySet()) {
-          @SuppressWarnings({"rawtypes"})
-          Map.Entry e = (Entry) o;
-          if (isEmpty) {// we know that there are no duplicates
-            add((String) e.getKey(), (T) e.getValue());
-          } else {
-            put(e.getKey() == null ? null : e.getKey().toString(), (T) e.getValue());
-          }
-        }
-      }
-
-      @Override
-      public void clear() {
-        NamedList.this.clear();
-      }
-
-      @Override
-      @SuppressWarnings({"unchecked"})
-      public Set<String> keySet() {
-        //TODO implement more efficiently
-        return  NamedList.this.asMap(1).keySet();
-      }
-
-      @Override
-      @SuppressWarnings({"unchecked", "rawtypes"})
-      public Collection values() {
-        //TODO implement more efficiently
-        return  NamedList.this.asMap(1).values();
-      }
-
-      @Override
-      public Set<Entry<String,T>> entrySet() {
-        //TODO implement more efficiently
-        return NamedList.this.asMap(1).entrySet();
-      }
-
-      @Override
-      public void forEach(BiConsumer action) {
-        NamedList.this.forEach(action);
-      }
-    };
+    return new ShallowMap(this, allowDps);
   }
 
   public Map asMap(int maxDepth) {
@@ -859,4 +776,103 @@ public class NamedList<T> implements Cloneable, Serializable, Iterable<Map.Entry
       action.accept(getName(i), getVal(i));
     }
   }
+
+  private static class ShallowMap<T> implements Map<String, T> {
+    private final boolean allowDps;
+    private NamedList<T> namedList;
+
+    public ShallowMap(NamedList<T> namedList, boolean allowDps) {
+      this.allowDps = allowDps;
+      this.namedList = namedList;
+    }
+
+    @Override
+    public int size() {
+      return namedList.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return size() == 0;
+    }
+
+    public boolean containsKey(Object  key) {
+      return namedList.get((String) key) != null ;
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+      return false;
+    }
+
+    @Override
+    public T get(Object key) {
+      return  namedList.get((String) key);
+    }
+
+    @Override
+    public T put(String  key, T value) {
+      if (allowDps) {
+        namedList.add(key, value);
+        return null;
+      }
+      int idx = namedList.indexOf(key, 0);
+      if (idx == -1) {
+        namedList.add(key, value);
+      } else {
+        namedList.setVal(idx, value);
+      }
+      return null;
+    }
+
+    @Override
+    public T remove(Object key) {
+      return  namedList.remove((String) key);
+    }
+
+    @Override
+    @SuppressWarnings({"unchecked"})
+    public void putAll(Map m) {
+      boolean isEmpty = isEmpty();
+      for (Object o : m.entrySet()) {
+        @SuppressWarnings({"rawtypes"})
+        Entry e = (Entry) o;
+        if (isEmpty) {// we know that there are no duplicates
+          namedList.add((String) e.getKey(), (T) e.getValue());
+        } else {
+          put(e.getKey() == null ? null : e.getKey().toString(), (T) e.getValue());
+        }
+      }
+    }
+
+    @Override
+    public void clear() {
+      namedList.clear();
+    }
+
+    @Override
+    @SuppressWarnings({"unchecked"})
+    public Set<String> keySet() {
+      //TODO implement more efficiently
+      return  namedList.asMap(1).keySet();
+    }
+
+    @Override
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public Collection values() {
+      //TODO implement more efficiently
+      return  namedList.asMap(1).values();
+    }
+
+    @Override
+    public Set<Entry<String,T>> entrySet() {
+      //TODO implement more efficiently
+      return namedList.asMap(1).entrySet();
+    }
+
+    @Override
+    public void forEach(BiConsumer action) {
+      namedList.forEach(action);
+    }
+  }
 }
diff --git a/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml b/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
index 3e237f5..a207c3b 100644
--- a/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
+++ b/solr/test-framework/src/resources/logconf/log4j2-std-debug.xml
@@ -20,7 +20,10 @@
     <Appenders>
 
         <Console name="STDERR_COLOR" target="SYSTEM_ERR">
-            <PatternLayout pattern="%style{%-4r}{yellow} %highlight{%maxLen{%-1p}{20}} %style{(%maxLen{%t}{20})}{yellow,bold} [%style{%X{node_name} %X{core}}{cyan}] %style{%c{1.}}{cyan} %highlight{%m %notEmpty{%ex}}\n"/>
+            <LogstashLayout dateTimeFormatPattern="yyyy-MM-dd'T'HH:mm:ss.SSSZZZ"
+                            eventTemplateUri="classpath:LogstashJsonEventLayoutV1.json"
+                            prettyPrintEnabled="true"
+                            stackTraceEnabled="true"/>
         </Console>
 
         <File name="FILE" fileName="${sys:user.home}/solr-test.log" immediateFlush="false" append="false">
@@ -59,7 +62,7 @@
 
         <AsyncRoot level="INFO">
             <AppenderRef ref="STDERR_COLOR"/>
-            <!--   <AppenderRef ref="FILE"/>-->
+            <AppenderRef ref="FILE"/>
          </AsyncRoot>
      </Loggers>
  </Configuration>
diff --git a/versions.props b/versions.props
index 9438583..775c88b 100644
--- a/versions.props
+++ b/versions.props
@@ -111,4 +111,5 @@ org.awaitility:awaitility:4.0.3
 org.xerial.snappy:snappy-java=1.1.8.1
 org.lz4:lz4-java:1.7.1
 commons-cli:commons-cli=1.4
-org.jline:jline=3.19.0
\ No newline at end of file
+org.jline:jline=3.19.0
+com.vlkan.log4j2:log4j2-logstash-layout=1.0.5