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.plugins.Plugin;
27  import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
28  import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
29  import org.apache.logging.log4j.core.config.plugins.PluginElement;
30  import org.apache.logging.log4j.core.util.Booleans;
31  
32  /**
33   * This Appender writes logging events to a NoSQL database using a configured NoSQL provider. It requires
34   * implementations of {@link NoSqlObject}, {@link NoSqlConnection}, and {@link NoSqlProvider} to "know" how to write
35   * events to the chosen NoSQL database.
36   * <p>
37   * For examples on how to write your own NoSQL provider, see the simple source code for the MongoDB and CouchDB
38   * providers.
39   * </p>
40   * 
41   * @see NoSqlObject
42   * @see NoSqlConnection
43   * @see NoSqlProvider
44   */
45  @Plugin(name = "NoSql", category = "Core", elementType = Appender.ELEMENT_TYPE, printObject = true)
46  public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseManager<?>> {
47  
48      /**
49       * Builds ConsoleAppender instances.
50       * 
51       * @param <B>
52       *            The type to build
53       */
54      public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
55              implements org.apache.logging.log4j.core.util.Builder<NoSqlAppender> {
56  
57          @PluginBuilderAttribute("bufferSize")
58          private int bufferSize;
59  
60          @PluginElement("NoSqlProvider")
61          private NoSqlProvider<?> provider;
62  
63          @SuppressWarnings("resource")
64          @Override
65          public NoSqlAppender build() {
66              final String name = getName();
67              if (provider == null) {
68                  LOGGER.error("NoSQL provider not specified for appender [{}].", name);
69                  return null;
70              }
71  
72              final String managerName = "noSqlManager{ description=" + name + ", bufferSize=" + bufferSize
73                      + ", provider=" + provider + " }";
74  
75              final NoSqlDatabaseManager<?> manager = NoSqlDatabaseManager.getNoSqlDatabaseManager(managerName,
76                      bufferSize, provider);
77              if (manager == null) {
78                  return null;
79              }
80  
81              return new NoSqlAppender(name, getFilter(), getLayout(), isIgnoreExceptions(), manager);
82          }
83  
84          /**
85           * Sets the buffer size.
86           * 
87           * @param bufferSize
88           *            If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
89           *            buffer reaches this size.
90           * @return this
91           */
92          public B setBufferSize(int bufferSize) {
93              this.bufferSize = bufferSize;
94              return asBuilder();
95          }
96  
97          /**
98           * Sets the provider.
99           * 
100          * @param provider
101          *            The NoSQL provider that provides connections to the chosen NoSQL database.
102          * @return this
103          */
104         public B setProvider(NoSqlProvider<?> provider) {
105             this.provider = provider;
106             return asBuilder();
107         }
108     }
109 
110     /**
111      * Factory method for creating a NoSQL appender within the plugin manager.
112      *
113      * @param name
114      *            The name of the appender.
115      * @param ignore
116      *            If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise they
117      *            are propagated to the caller.
118      * @param filter
119      *            The filter, if any, to use.
120      * @param bufferSize
121      *            If an integer greater than 0, this causes the appender to buffer log events and flush whenever the
122      *            buffer reaches this size.
123      * @param provider
124      *            The NoSQL provider that provides connections to the chosen NoSQL database.
125      * @return a new NoSQL appender.
126      * @deprecated since 2.11.0; use {@link Builder}.
127      */
128     @SuppressWarnings("resource")
129     @Deprecated
130     public static NoSqlAppender createAppender(
131     // @formatter:off
132             final String name,
133             final String ignore, 
134             final Filter filter,
135             final String bufferSize,
136             final NoSqlProvider<?> provider) {
137     // @formatter:on
138         if (provider == null) {
139             LOGGER.error("NoSQL provider not specified for appender [{}].", name);
140             return null;
141         }
142 
143         final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0);
144         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
145 
146         final String managerName = "noSqlManager{ description=" + name + ", bufferSize=" + bufferSizeInt + ", provider="
147                 + provider + " }";
148 
149         final NoSqlDatabaseManager<?> manager = NoSqlDatabaseManager.getNoSqlDatabaseManager(managerName, bufferSizeInt,
150                 provider);
151         if (manager == null) {
152             return null;
153         }
154 
155         return new NoSqlAppender(name, filter, null, ignoreExceptions, manager);
156     }
157 
158     @PluginBuilderFactory
159     public static <B extends Builder<B>> B newBuilder() {
160         return new Builder<B>().asBuilder();
161     }
162 
163     private final String description;
164 
165     private NoSqlAppender(final String name, final Filter filter, Layout<? extends Serializable> layout,
166             final boolean ignoreExceptions, final NoSqlDatabaseManager<?> manager) {
167         super(name, filter, layout, ignoreExceptions, manager);
168         this.description = this.getName() + "{ manager=" + this.getManager() + " }";
169     }
170 
171     @Override
172     public String toString() {
173         return this.description;
174     }
175 }