mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

neil_a_wilson
01.17.2007 b4bae64723d5797ec0658312f2212dc97bf3c571
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
 
 
 
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;
 
import org.opends.server.api.ErrorLogger;
import org.opends.server.config.ConfigEntry;
import org.opends.server.types.ErrorLogCategory;
import org.opends.server.types.ErrorLogSeverity;
import org.opends.server.util.TimeThread;
 
 
 
/**
 * This class defines a Directory Server error logger that will be used only
 * during startup.  It makes it possible for informational, warning, and error
 * messages to be generated during startup and made available to the user for
 * things that happen before the configuration can be parsed and all of the
 * actual error loggers instantiated and registered.  This error logger will be
 * taken out of service once the startup is complete.
 * <BR><BR>
 * By default, fatal errors, severe errors, severe warnings, and important
 * information will be logged.  This can be modified on a per-category basis
 * using a "DS_ERROR_LEVEL" environment variable that should be a
 * semicolon-delimited list in which each element in that list should contain
 * the name of the category, an equal sign, and a comma-delimited list of the
 * severity levels to use for that category.
 */
public class StartupErrorLogger
       extends ErrorLogger
{
  /**
   * The name of the environment variable that may be used to alter the kinds of
   * messages that get logged with this startup error logger.
   */
  public static final String ENV_VARIABLE_ERROR_LOG_LEVEL = "DS_ERROR_LEVEL";
 
 
 
  // The hash map that will be used to define specific log severities for the
  // various categories.
  private HashMap<ErrorLogCategory,HashSet<ErrorLogSeverity>> definedSeverities;
 
  // The set of default log severities that will be used if no custom severities
  // have been defined for the associated category.
  private HashSet<ErrorLogSeverity> defaultSeverities;
 
  // The writer that will be used to actually write the messages.
  private PrintWriter writer;
 
 
 
  /**
   * Creates a new instance of this startup error logger.  It does not actually
   * do anything, since all initialization is performed in the
   * <CODE>initializeErrorLogger</CODE> method.
   */
  public StartupErrorLogger()
  {
    super();
  }
 
 
 
  /**
   * Initializes this error logger based on the information in the provided
   * configuration entry.
   *
   * @param  configEntry  The configuration entry that contains the information
   *                      to use to initialize this error logger.
   */
  public void initializeErrorLogger(ConfigEntry configEntry)
  {
    writer = new PrintWriter(System.err, true);
 
    defaultSeverities = new HashSet<ErrorLogSeverity>();
    defaultSeverities.add(ErrorLogSeverity.FATAL_ERROR);
    defaultSeverities.add(ErrorLogSeverity.SEVERE_ERROR);
    defaultSeverities.add(ErrorLogSeverity.SEVERE_WARNING);
    defaultSeverities.add(ErrorLogSeverity.NOTICE);
 
    definedSeverities =
         new HashMap<ErrorLogCategory,HashSet<ErrorLogSeverity>>();
 
 
    String logLevelInfo = System.getenv(ENV_VARIABLE_ERROR_LOG_LEVEL);
    if (logLevelInfo != null)
    {
      StringTokenizer tokenizer = new StringTokenizer(logLevelInfo, ";");
      while (tokenizer.hasMoreTokens())
      {
        String token = tokenizer.nextToken();
        int equalPos = token.indexOf('=');
        if (equalPos < 0)
        {
          writer.println("StartupErrorLogger:  Token \"" + token +
                         "\" read from environment variable " +
                         ENV_VARIABLE_ERROR_LOG_LEVEL + " does not contain " +
                         "an equal sign to separate the category from the " +
                         "severity list.  It will be ignored");
          continue;
        }
 
        String categoryName = token.substring(0, equalPos);
        ErrorLogCategory category = ErrorLogCategory.getByName(categoryName);
        if (category == null)
        {
          writer.println("StartupErrorLogger:  Unknown error log category \"" +
                         categoryName + "\" read from environment variable " +
                         ENV_VARIABLE_ERROR_LOG_LEVEL + " will be ignored.");
          continue;
        }
 
        HashSet<ErrorLogSeverity> severities = new HashSet<ErrorLogSeverity>();
        StringTokenizer sevTokenizer =
             new StringTokenizer(token.substring(equalPos+1), ",");
        while (sevTokenizer.hasMoreElements())
        {
          String severityName = sevTokenizer.nextToken();
          ErrorLogSeverity severity = ErrorLogSeverity.getByName(severityName);
          if (severity == null)
          {
            writer.println("StartupErrorLogger:  Unknown error log severity " +
                           "\"" + severityName + "\" read from environment " +
                           "variable " + ENV_VARIABLE_ERROR_LOG_LEVEL +
                           " will be ignored.");
            continue;
          }
          else
          {
            severities.add(severity);
          }
        }
 
        definedSeverities.put(category, severities);
      }
    }
  }
 
 
 
  /**
   * Closes this error logger and releases any resources it might have held.
   */
  public void closeErrorLogger()
  {
    // No action is required, and this logger will remain usable.
  }
 
 
 
  /**
   * Writes a message to the error log using the provided information.
   *
   * @param  category  The category that may be used to determine whether to
   *                   actually log this message.
   * @param  severity  The severity that may be used to determine whether to
   *                   actually log this message.
   * @param  message   The message to be logged.
   * @param  errorID   The error ID that uniquely identifies the format string
   *                   used to generate the provided message.
   */
  public void logError(ErrorLogCategory category, ErrorLogSeverity severity,
                       String message, int errorID)
  {
    HashSet<ErrorLogSeverity> severities = definedSeverities.get(category);
    if (severities == null)
    {
      severities = defaultSeverities;
    }
 
    if (severities.contains(severity))
    {
      StringBuilder logMsg = new StringBuilder();
 
      logMsg.append('[');
      logMsg.append(TimeThread.getLocalTime());
      logMsg.append("] category=");
      logMsg.append(category.getCategoryName());
      logMsg.append(" severity=");
      logMsg.append(severity.getSeverityName());
      logMsg.append(" id=");
      logMsg.append(errorID);
      logMsg.append(" msg=\"");
      logMsg.append(message);
      logMsg.append("\"");
 
      writer.println(logMsg.toString());
    }
  }
 
 
 
  /**
   * Indicates whether the provided object is equal to this error logger.
   *
   * @param  o  The object for which to make the determination.
   *
   * @return  <CODE>true</CODE> if the provided object is determined to be equal
   *          to this error logger, or <CODE>false</CODE> if not.
   */
  public boolean equals(Object o)
  {
    if (this == o)
    {
      return true;
    }
 
    if ((o == null) || (! (o instanceof StartupErrorLogger)))
    {
      return false;
    }
 
    return true;
  }
 
 
 
  /**
   * Retrieves the hash code for this error logger.
   *
   * @return  The hash code for this error logger.
   */
  public int hashCode()
  {
    // Just make one up, since there should never be a need to have more than
    // one instance of this error logger.
    return 12345;
  }
}