001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017 package org.apache.logging.log4j.core.appender;
018
019 import java.io.Serializable;
020
021 import org.apache.logging.log4j.Logger;
022 import org.apache.logging.log4j.core.Appender;
023 import org.apache.logging.log4j.core.ErrorHandler;
024 import org.apache.logging.log4j.core.LogEvent;
025 import org.apache.logging.log4j.status.StatusLogger;
026
027 /**
028 *
029 */
030 public class DefaultErrorHandler implements ErrorHandler, Serializable {
031
032 private static final long serialVersionUID = 1L;
033
034 private static final Logger LOGGER = StatusLogger.getLogger();
035
036 private static final int MAX_EXCEPTIONS = 3;
037
038 private static final int EXCEPTION_INTERVAL = 300000;
039
040 private int exceptionCount = 0;
041
042 private long lastException;
043
044 private final Appender appender;
045
046 public DefaultErrorHandler(final Appender appender) {
047 this.appender = appender;
048 }
049
050
051 /**
052 * Handle an error with a message.
053 * @param msg The message.
054 */
055 @Override
056 public void error(final String msg) {
057 final long current = System.currentTimeMillis();
058 if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
059 LOGGER.error(msg);
060 }
061 lastException = current;
062 }
063
064 /**
065 * Handle an error with a message and an exception.
066 * @param msg The message.
067 * @param t The Throwable.
068 */
069 @Override
070 public void error(final String msg, final Throwable t) {
071 final long current = System.currentTimeMillis();
072 if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
073 LOGGER.error(msg, t);
074 }
075 lastException = current;
076 if (!appender.ignoreExceptions() && t != null && !(t instanceof AppenderLoggingException)) {
077 throw new AppenderLoggingException(msg, t);
078 }
079 }
080
081 /**
082 * Handle an error with a message, and exception and a logging event.
083 * @param msg The message.
084 * @param event The LogEvent.
085 * @param t The Throwable.
086 */
087 @Override
088 public void error(final String msg, final LogEvent event, final Throwable t) {
089 final long current = System.currentTimeMillis();
090 if (lastException + EXCEPTION_INTERVAL < current || exceptionCount++ < MAX_EXCEPTIONS) {
091 LOGGER.error(msg, t);
092 }
093 lastException = current;
094 if (!appender.ignoreExceptions() && t != null && !(t instanceof AppenderLoggingException)) {
095 throw new AppenderLoggingException(msg, t);
096 }
097 }
098 }