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.async;
018
019 import java.util.Map;
020
021 import org.apache.logging.log4j.Level;
022 import org.apache.logging.log4j.Marker;
023 import org.apache.logging.log4j.ThreadContext.ContextStack;
024 import org.apache.logging.log4j.message.Message;
025
026 import com.lmax.disruptor.EventTranslator;
027
028 /**
029 * This class is responsible for writing elements that make up a log event into
030 * the ringbuffer {@code RingBufferLogEvent}. After this translator populated
031 * the ringbuffer event, the disruptor will update the sequence number so that
032 * the event can be consumed by another thread.
033 */
034 public class RingBufferLogEventTranslator implements
035 EventTranslator<RingBufferLogEvent> {
036
037 private AsyncLogger asyncLogger;
038 private String loggerName;
039 private Marker marker;
040 private String fqcn;
041 private Level level;
042 private Message message;
043 private Throwable thrown;
044 private Map<String, String> contextMap;
045 private ContextStack contextStack;
046 private String threadName;
047 private StackTraceElement location;
048 private long currentTimeMillis;
049
050 // @Override
051 @Override
052 public void translateTo(final RingBufferLogEvent event, final long sequence) {
053 event.setValues(asyncLogger, loggerName, marker, fqcn, level, message,
054 thrown, contextMap, contextStack, threadName, location,
055 currentTimeMillis);
056 clear();
057 }
058
059 /**
060 * Release references held by this object to allow objects to be
061 * garbage-collected.
062 */
063 private void clear() {
064 setValues(null, // asyncLogger
065 null, // loggerName
066 null, // marker
067 null, // fqcn
068 null, // level
069 null, // data
070 null, // t
071 null, // map
072 null, // contextStack
073 null, // threadName
074 null, // location
075 0 // currentTimeMillis
076 );
077 }
078
079 public void setValues(final AsyncLogger asyncLogger, final String loggerName,
080 final Marker marker, final String fqcn, final Level level, final Message message,
081 final Throwable thrown, final Map<String, String> contextMap,
082 final ContextStack contextStack, final String threadName,
083 final StackTraceElement location, final long currentTimeMillis) {
084 this.asyncLogger = asyncLogger;
085 this.loggerName = loggerName;
086 this.marker = marker;
087 this.fqcn = fqcn;
088 this.level = level;
089 this.message = message;
090 this.thrown = thrown;
091 this.contextMap = contextMap;
092 this.contextStack = contextStack;
093 this.threadName = threadName;
094 this.location = location;
095 this.currentTimeMillis = currentTimeMillis;
096 }
097
098 }