// // GTMLoggerRingBufferWriter.h // // Copyright 2007-2008 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // #import "GTMLogger.h" #import "GTMDefines.h" typedef struct GTMRingBufferPair GTMRingBufferPair; // GTMLoggerRingBufferWriter is a GTMLogWriter that accumulates logged Info // and Debug messages (when they're not compiled out in a release build) // into a ring buffer. If an Error or Assert message is // logged, all of the previously logged messages (up to the size of the // buffer) are then logged. At that point the buffer resets itself. // // How to use: // // * Create a logger writer that you want to use to do the ultimate writing, // such as to stdErr, or a log file, or an NSArray that aggregates other // writers. // id someWriter = ... // // * Make a new ring buffer with this writer, along with the buffer's // capacity (which must be >= 1): // rbw = // [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32 // writer:someWriter]; // // * Set your logger's writer to be the ring buffer writer: // [[GTMLogger sharedLogger] setWriter:rbw]; // // Note that this writer is at the end of the GTMLogger food chain, where the // default filter removes Info messages in Release mode (Debug messages are // compiled out). You can pass nil to GTMLogger's -setFilter to have it pass // along all the messages. // @interface GTMLoggerRingBufferWriter : NSObject { @private id writer_; GTMRingBufferPair *buffer_; NSUInteger capacity_; NSUInteger nextIndex_; // Index of the next element of |buffer_| to fill. NSUInteger totalLogged_; // This > 0 and |nextIndex_| == 0 means we've wrapped. } // Returns an autoreleased ring buffer writer. If |writer| is nil, // then nil is returned. + (id)ringBufferWriterWithCapacity:(NSUInteger)capacity writer:(id)loggerWriter; // Designated initializer. If |writer| is nil, then nil is returned. // If you just use -init, nil will be returned. - (id)initWithCapacity:(NSUInteger)capacity writer:(id)loggerWriter; // How many messages will be logged before older messages get dropped // on the floor. - (NSUInteger)capacity; // The log writer that will get the buffered log messages if/when they // need to be displayed. - (id)writer; // How many log messages are currently in the buffer. - (NSUInteger)count; // How many have been dropped on the floor since creation, or the last // reset. - (NSUInteger)droppedLogCount; // The total number of messages processed since creation, or the last // reset. - (NSUInteger)totalLogged; // Purge the contents and reset the counters. - (void)reset; // Print out the contents without resetting anything. // Contents are automatically printed and reset when an error-level // message comes through. - (void)dumpContents; @end // GTMLoggerRingBufferWriter