Browse Source

fix #2863 Add upper limits to search and click log queue sizes

Shinsuke Sugaya 6 tháng trước cách đây
mục cha
commit
5377e82e7e

+ 10 - 1
src/main/java/org/codelibs/fess/helper/SearchLogHelper.java

@@ -105,12 +105,16 @@ public class SearchLogHelper {
 
 
     public void addSearchLog(final SearchRequestParams params, final LocalDateTime requestedTime, final String queryId, final String query,
     public void addSearchLog(final SearchRequestParams params, final LocalDateTime requestedTime, final String queryId, final String query,
             final int pageStart, final int pageSize, final QueryResponseList queryResponseList) {
             final int pageStart, final int pageSize, final QueryResponseList queryResponseList) {
+        final FessConfig fessConfig = ComponentUtil.getFessConfig();
+        if (searchLogQueue.size() > fessConfig.getLoggingSearchMaxQueueSizeAsInteger()) {
+            logger.warn("[{}] The search log queue size is too large. Skipped the search log: {}", queryId, query);
+            return;
+        }
 
 
         final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper();
         final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper();
         final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
         final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
         final SearchLog searchLog = new SearchLog();
         final SearchLog searchLog = new SearchLog();
 
 
-        final FessConfig fessConfig = ComponentUtil.getFessConfig();
         if (fessConfig.isUserInfo()) {
         if (fessConfig.isUserInfo()) {
             final String userCode = userInfoHelper.getUserCode();
             final String userCode = userInfoHelper.getUserCode();
             if (userCode != null) {
             if (userCode != null) {
@@ -199,6 +203,11 @@ public class SearchLogHelper {
     }
     }
 
 
     public void addClickLog(final ClickLog clickLog) {
     public void addClickLog(final ClickLog clickLog) {
+        final FessConfig fessConfig = ComponentUtil.getFessConfig();
+        if (clickLogQueue.size() > fessConfig.getLoggingClickMaxQueueSizeAsInteger()) {
+            logger.warn("[{}] The click log queue size is too large. Skipped the click log: {} {}", clickLog);
+            return;
+        }
         clickLogQueue.add(clickLog);
         clickLogQueue.add(clickLog);
     }
     }
 
 

+ 63 - 10
src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java

@@ -1197,6 +1197,9 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     /** The key of the configuration. e.g. 60000 */
     /** The key of the configuration. e.g. 60000 */
     String INDEX_BACKUP_LOG_LOAD_TIMEOUT = "index.backup.log.load.timeout";
     String INDEX_BACKUP_LOG_LOAD_TIMEOUT = "index.backup.log.load.timeout";
 
 
+    /** The key of the configuration. e.g. org.codelibs,org.dbflute,org.lastaflute */
+    String LOGGING_APP_PACKAGES = "logging.app.packages";
+
     /** The key of the configuration. e.g. true */
     /** The key of the configuration. e.g. true */
     String LOGGING_SEARCH_DOCS_ENABLED = "logging.search.docs.enabled";
     String LOGGING_SEARCH_DOCS_ENABLED = "logging.search.docs.enabled";
 
 
@@ -1206,8 +1209,11 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     /** The key of the configuration. e.g. true */
     /** The key of the configuration. e.g. true */
     String LOGGING_SEARCH_USE_LOGFILE = "logging.search.use.logfile";
     String LOGGING_SEARCH_USE_LOGFILE = "logging.search.use.logfile";
 
 
-    /** The key of the configuration. e.g. org.codelibs,org.dbflute,org.lastaflute */
-    String LOGGING_APP_PACKAGES = "logging.app.packages";
+    /** The key of the configuration. e.g. 10000 */
+    String LOGGING_SEARCH_MAX_QUEUE_SIZE = "logging.search.max.queue.size";
+
+    /** The key of the configuration. e.g. 10000 */
+    String LOGGING_CLICK_MAX_QUEUE_SIZE = "logging.click.max.queue.size";
 
 
     /** The key of the configuration. e.g. 10000 */
     /** The key of the configuration. e.g. 10000 */
     String FORM_ADMIN_MAX_INPUT_SIZE = "form.admin.max.input.size";
     String FORM_ADMIN_MAX_INPUT_SIZE = "form.admin.max.input.size";
@@ -5626,10 +5632,17 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
      */
      */
     Integer getIndexBackupLogLoadTimeoutAsInteger();
     Integer getIndexBackupLogLoadTimeoutAsInteger();
 
 
+    /**
+     * Get the value for the key 'logging.app.packages'. <br>
+     * The value is, e.g. org.codelibs,org.dbflute,org.lastaflute <br>
+     * comment: logging
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getLoggingAppPackages();
+
     /**
     /**
      * Get the value for the key 'logging.search.docs.enabled'. <br>
      * Get the value for the key 'logging.search.docs.enabled'. <br>
      * The value is, e.g. true <br>
      * The value is, e.g. true <br>
-     * comment: logging
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      */
      */
     String getLoggingSearchDocsEnabled();
     String getLoggingSearchDocsEnabled();
@@ -5637,7 +5650,6 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     /**
     /**
      * Is the property for the key 'logging.search.docs.enabled' true? <br>
      * Is the property for the key 'logging.search.docs.enabled' true? <br>
      * The value is, e.g. true <br>
      * The value is, e.g. true <br>
-     * comment: logging
      * @return The determination, true or false. (if not found, exception but basically no way)
      * @return The determination, true or false. (if not found, exception but basically no way)
      */
      */
     boolean isLoggingSearchDocsEnabled();
     boolean isLoggingSearchDocsEnabled();
@@ -5664,11 +5676,34 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
     boolean isLoggingSearchUseLogfile();
     boolean isLoggingSearchUseLogfile();
 
 
     /**
     /**
-     * Get the value for the key 'logging.app.packages'. <br>
-     * The value is, e.g. org.codelibs,org.dbflute,org.lastaflute <br>
+     * Get the value for the key 'logging.search.max.queue.size'. <br>
+     * The value is, e.g. 10000 <br>
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      * @return The value of found property. (NotNull: if not found, exception but basically no way)
      */
      */
-    String getLoggingAppPackages();
+    String getLoggingSearchMaxQueueSize();
+
+    /**
+     * Get the value for the key 'logging.search.max.queue.size' as {@link Integer}. <br>
+     * The value is, e.g. 10000 <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     * @throws NumberFormatException When the property is not integer.
+     */
+    Integer getLoggingSearchMaxQueueSizeAsInteger();
+
+    /**
+     * Get the value for the key 'logging.click.max.queue.size'. <br>
+     * The value is, e.g. 10000 <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     */
+    String getLoggingClickMaxQueueSize();
+
+    /**
+     * Get the value for the key 'logging.click.max.queue.size' as {@link Integer}. <br>
+     * The value is, e.g. 10000 <br>
+     * @return The value of found property. (NotNull: if not found, exception but basically no way)
+     * @throws NumberFormatException When the property is not integer.
+     */
+    Integer getLoggingClickMaxQueueSizeAsInteger();
 
 
     /**
     /**
      * Get the value for the key 'form.admin.max.input.size'. <br>
      * Get the value for the key 'form.admin.max.input.size'. <br>
@@ -9799,6 +9834,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             return getAsInteger(FessConfig.INDEX_BACKUP_LOG_LOAD_TIMEOUT);
             return getAsInteger(FessConfig.INDEX_BACKUP_LOG_LOAD_TIMEOUT);
         }
         }
 
 
+        public String getLoggingAppPackages() {
+            return get(FessConfig.LOGGING_APP_PACKAGES);
+        }
+
         public String getLoggingSearchDocsEnabled() {
         public String getLoggingSearchDocsEnabled() {
             return get(FessConfig.LOGGING_SEARCH_DOCS_ENABLED);
             return get(FessConfig.LOGGING_SEARCH_DOCS_ENABLED);
         }
         }
@@ -9819,8 +9858,20 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
             return is(FessConfig.LOGGING_SEARCH_USE_LOGFILE);
             return is(FessConfig.LOGGING_SEARCH_USE_LOGFILE);
         }
         }
 
 
-        public String getLoggingAppPackages() {
-            return get(FessConfig.LOGGING_APP_PACKAGES);
+        public String getLoggingSearchMaxQueueSize() {
+            return get(FessConfig.LOGGING_SEARCH_MAX_QUEUE_SIZE);
+        }
+
+        public Integer getLoggingSearchMaxQueueSizeAsInteger() {
+            return getAsInteger(FessConfig.LOGGING_SEARCH_MAX_QUEUE_SIZE);
+        }
+
+        public String getLoggingClickMaxQueueSize() {
+            return get(FessConfig.LOGGING_CLICK_MAX_QUEUE_SIZE);
+        }
+
+        public Integer getLoggingClickMaxQueueSizeAsInteger() {
+            return getAsInteger(FessConfig.LOGGING_CLICK_MAX_QUEUE_SIZE);
         }
         }
 
 
         public String getFormAdminMaxInputSize() {
         public String getFormAdminMaxInputSize() {
@@ -11358,11 +11409,13 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
                     "fess_basic_config.bulk,fess_config.bulk,fess_user.bulk,system.properties,fess.json,doc.json");
                     "fess_basic_config.bulk,fess_config.bulk,fess_user.bulk,system.properties,fess.json,doc.json");
             defaultMap.put(FessConfig.INDEX_BACKUP_LOG_TARGETS, "click_log.ndjson,favorite_log.ndjson,search_log.ndjson,user_info.ndjson");
             defaultMap.put(FessConfig.INDEX_BACKUP_LOG_TARGETS, "click_log.ndjson,favorite_log.ndjson,search_log.ndjson,user_info.ndjson");
             defaultMap.put(FessConfig.INDEX_BACKUP_LOG_LOAD_TIMEOUT, "60000");
             defaultMap.put(FessConfig.INDEX_BACKUP_LOG_LOAD_TIMEOUT, "60000");
+            defaultMap.put(FessConfig.LOGGING_APP_PACKAGES, "org.codelibs,org.dbflute,org.lastaflute");
             defaultMap.put(FessConfig.LOGGING_SEARCH_DOCS_ENABLED, "true");
             defaultMap.put(FessConfig.LOGGING_SEARCH_DOCS_ENABLED, "true");
             defaultMap.put(FessConfig.LOGGING_SEARCH_DOCS_FIELDS,
             defaultMap.put(FessConfig.LOGGING_SEARCH_DOCS_FIELDS,
                     "filetype,created,click_count,title,doc_id,url,score,site,filename,host,digest,boost,mimetype,favorite_count,_id,lang,last_modified,content_length,timestamp");
                     "filetype,created,click_count,title,doc_id,url,score,site,filename,host,digest,boost,mimetype,favorite_count,_id,lang,last_modified,content_length,timestamp");
             defaultMap.put(FessConfig.LOGGING_SEARCH_USE_LOGFILE, "true");
             defaultMap.put(FessConfig.LOGGING_SEARCH_USE_LOGFILE, "true");
-            defaultMap.put(FessConfig.LOGGING_APP_PACKAGES, "org.codelibs,org.dbflute,org.lastaflute");
+            defaultMap.put(FessConfig.LOGGING_SEARCH_MAX_QUEUE_SIZE, "10000");
+            defaultMap.put(FessConfig.LOGGING_CLICK_MAX_QUEUE_SIZE, "10000");
             defaultMap.put(FessConfig.FORM_ADMIN_MAX_INPUT_SIZE, "10000");
             defaultMap.put(FessConfig.FORM_ADMIN_MAX_INPUT_SIZE, "10000");
             defaultMap.put(FessConfig.FORM_ADMIN_LABEL_IN_CONFIG_ENABLED, "false");
             defaultMap.put(FessConfig.FORM_ADMIN_LABEL_IN_CONFIG_ENABLED, "false");
             defaultMap.put(FessConfig.FORM_ADMIN_DEFAULT_TEMPLATE_NAME, "__TEMPLATE__");
             defaultMap.put(FessConfig.FORM_ADMIN_DEFAULT_TEMPLATE_NAME, "__TEMPLATE__");

+ 3 - 1
src/main/resources/fess_config.properties

@@ -631,10 +631,12 @@ index.backup.log.targets=click_log.ndjson,favorite_log.ndjson,search_log.ndjson,
 index.backup.log.load.timeout=60000
 index.backup.log.load.timeout=60000
 
 
 # logging
 # logging
+logging.app.packages=org.codelibs,org.dbflute,org.lastaflute
 logging.search.docs.enabled=true
 logging.search.docs.enabled=true
 logging.search.docs.fields=filetype,created,click_count,title,doc_id,url,score,site,filename,host,digest,boost,mimetype,favorite_count,_id,lang,last_modified,content_length,timestamp
 logging.search.docs.fields=filetype,created,click_count,title,doc_id,url,score,site,filename,host,digest,boost,mimetype,favorite_count,_id,lang,last_modified,content_length,timestamp
 logging.search.use.logfile=true
 logging.search.use.logfile=true
-logging.app.packages=org.codelibs,org.dbflute,org.lastaflute
+logging.search.max.queue.size=10000
+logging.click.max.queue.size=10000
 
 
 # ========================================================================================
 # ========================================================================================
 #                                                                                     Web
 #                                                                                     Web