View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements. See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache license, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License. You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the license for the specific language governing permissions and
15   * limitations under the license.
16   */
17  package org.apache.logging.log4j.core.appender.nosql;
18  
19  import java.io.Serializable;
20  
21  import org.apache.logging.log4j.core.Appender;
22  import org.apache.logging.log4j.core.Filter;
23  import org.apache.logging.log4j.core.Layout;
24  import org.apache.logging.log4j.core.appender.AbstractAppender;
25  import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
26  import org.apache.logging.log4j.core.config.Property;
27  import org.apache.logging.log4j.core.config.plugins.Plugin;
28  import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
29  import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
30  import org.apache.logging.log4j.core.config.plugins.PluginElement;
31  import org.apache.logging.log4j.core.util.Booleans;
32  
33  /**
34   * This Appender writes logging events to a NoSQL database using a configured NoSQL provider. It requires
35   * implementations of {@link NoSqlObject}, {@link NoSqlConnection}, and {@link NoSqlProvider} to "know" how to write
36   * events to the chosen NoSQL database.
37   * <p>
38   * For examples on how to write your own NoSQL provider, see the simple source code for the MongoDB and CouchDB
39   * providers.
40   * </p>
41   *
42   * @see NoSqlObject
43   * @see NoSqlConnection
44   * @see NoSqlProvider
45   */
46  @Plugin(name = "NoSql", category = "Core", elementType = Appender.ELEMENT_TYPE, printObject = true)
47  public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseManager<?>> {
48  
49      /**
50       * Builds ConsoleAppender instances.
51       *
52       * @param <B>
53       *            The type to build
54       */
55      public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
56              implements org.apache.logging.log4j.core.util.Builder<NoSqlAppender> {
57  
58          @PluginBuilderAttribute("bufferSize")
59          private int bufferSize;
60  
61          @PluginElement("NoSqlProvider")
62          private NoSqlProvider<?> provider;
63  
64          @SuppressWarnings("resource")
65          @Override
66          public NoSqlAppender build() {
67              final String name = getName();
68              if (provider == null) {
69                  LOGGER.error("NoSQL provider not specified for appender [{}].", name);
70                  return null;
71              }
72  
73              final String managerName = "noSqlManager{ description=" + name + ", bufferSize=" + bufferSize
74                      + ", provider=" + provider + " }";
75  
76              final NoSqlDatabaseManager<?> manager = NoSqlDatabaseManager.getNoSqlDatabaseManager(managerName,
77                      bufferSize, provider);
78              if (manager == null) {
79                  return null;
80              }
81  
82              return new NoSqlAppender(name, getFilter(), getLayout(), isIgnoreExceptions(), getPropertyArray(), manager);
83          }
84  
85          /**
86           * Sets the buffer size.
87           *
88           * @param bufferSize
89           *            If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
90           *            buffer reaches this size.
91           * @return this
92           */
93          public B setBufferSize(final int bufferSize) {
94              this.bufferSize = bufferSize;
95              return asBuilder();
96          }
97  
98          /**
99           * Sets the provider.
100          *
101          * @param provider
102          *            The NoSQL provider that provides connections to the chosen NoSQL database.
103          * @return this
104          */
105         public B setProvider(final NoSqlProvider<?> provider) {
106             this.provider = provider;
107             return asBuilder();
108         }
109     }
110 
111     /**
112      * Factory method for creating a NoSQL appender within the plugin manager.
113      *
114      * @param name
115      *            The name of the appender.
116      * @param ignore
117      *            If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise they
118      *            are propagated to the caller.
119      * @param filter
120      *            The filter, if any, to use.
121      * @param bufferSize
122      *            If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
123      *            buffer reaches this size.
124      * @param provider
125      *            The NoSQL provider that provides connections to the chosen NoSQL database.
126      * @return a new NoSQL appender.
127      * @deprecated since 2.11.0; use {@link Builder}.
128      */
129     @SuppressWarnings("resource")
130     @Deprecated
131     public static NoSqlAppender createAppender(
132     // @formatter:off
133             final String name,
134             final String ignore,
135             final Filter filter,
136             final String bufferSize,
137             final NoSqlProvider<?> provider) {
138     // @formatter:on
139         if (provider == null) {
140             LOGGER.error("NoSQL provider not specified for appender [{}].", name);
141             return null;
142         }
143 
144         final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0);
145         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
146 
147         final String managerName = "noSqlManager{ description=" + name + ", bufferSize=" + bufferSizeInt + ", provider="
148                 + provider + " }";
149 
150         final NoSqlDatabaseManager<?> manager = NoSqlDatabaseManager.getNoSqlDatabaseManager(managerName, bufferSizeInt,
151                 provider);
152         if (manager == null) {
153             return null;
154         }
155 
156         return new NoSqlAppender(name, filter, null, ignoreExceptions, null, manager);
157     }
158 
159     @PluginBuilderFactory
160     public static <B extends Builder<B>> B newBuilder() {
161         return new Builder<B>().asBuilder();
162     }
163 
164     private final String description;
165 
166     private NoSqlAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
167             final boolean ignoreExceptions, final Property[] properties, final NoSqlDatabaseManager<?> manager) {
168         super(name, filter, layout, ignoreExceptions, properties, manager);
169         this.description = this.getName() + "{ manager=" + this.getManager() + " }";
170     }
171 
172     @Override
173     public String toString() {
174         return this.description;
175     }
176 }