Example #1
0
        /// <summary>
        /// Adds a durable sink that sends log events using HTTP POST over the network. The log
        /// events are always stored on disk in the case that the log server cannot be reached.
        /// <para />
        /// The buffer files will use a rolling behavior defined by the time interval specified in
        /// <paramref name="bufferRollingInterval"/>, i.e. a new buffer file is created every time
        /// a new interval is started. The maximum size of a buffer file is defined by
        /// <paramref name="bufferFileSizeLimitBytes"/>, and when that limit is reached all new log
        /// events will be dropped until a new interval is started.
        /// <para />
        /// A durable sink will protect you against data loss after a system or process restart.
        /// </summary>
        /// <param name="sinkConfiguration">The logger configuration.</param>
        /// <param name="requestUri">The URI the request is sent to.</param>
        /// <param name="bufferBaseFileName">
        /// The relative or absolute path for a set of files that will be used to buffer events
        /// until they can be successfully transmitted across the network. Individual files will be
        /// created using the pattern "<paramref name="bufferBaseFileName"/>-*.txt", which should
        /// not clash with any other file names in the same directory. Default value is "Buffer".
        /// </param>
        /// <param name="bufferRollingInterval">
        /// The interval at which the buffer files are rotated. Default value is Day.
        /// </param>
        /// <param name="bufferFileSizeLimitBytes">
        /// The approximate maximum size, in bytes, to which a buffer file for a specific time
        /// interval will be allowed to grow. By default no limit will be applied.
        /// </param>
        /// <param name="bufferFileShared">
        /// Allow the buffer file to be shared by multiple processes. Default value is false.
        /// </param>
        /// <param name="retainedBufferFileCountLimit">
        /// The maximum number of buffer files that will be retained, including the current buffer
        /// file. Under normal operation only 2 files will be kept, however if the log server is
        /// unreachable, the number of files specified by
        /// <paramref name="retainedBufferFileCountLimit"/> will be kept on the file system. For
        /// unlimited retention, pass null. Default value is 31.
        /// </param>
        /// <param name="logEventLimitBytes">
        /// The maximum size, in bytes, for a serialized representation of a log event. Log events
        /// exceeding this size will be dropped. Specify null for no limit. Default value is null.
        /// </param>
        /// <param name="logEventsInBatchLimit">
        /// The maximum number of log events sent as a single batch over the network. Default
        /// value is 1000.
        /// </param>
        /// <param name="batchSizeLimitBytes">
        /// The approximate maximum size, in bytes, for a single batch. The value is an
        /// approximation because only the size of the log events are considered. The extra
        /// characters added by the batch formatter, where the sequence of serialized log events
        /// are transformed into a payload, are not considered. Please make sure to accommodate for
        /// those.
        /// <para />
        /// Another thing to mention is that although the sink does its best to optimize for this
        /// limit, if you decide to use an implementation of <seealso cref="IHttpClient"/> that is
        /// compressing the payload, e.g. <seealso cref="JsonGzipHttpClient"/>, this parameter
        /// describes the uncompressed size of the log events. The compressed size might be
        /// significantly smaller depending on the compression algorithm and the repetitiveness of
        /// the log events.
        /// <para />
        /// Default value is null.
        /// </param>
        /// <param name="period">
        /// The time to wait between checking for event batches. Default value is 2 seconds.
        /// </param>
        /// <param name="textFormatter">
        /// The formatter rendering individual log events into text, for example JSON. Default
        /// value is <see cref="NormalRenderedTextFormatter"/>.
        /// </param>
        /// <param name="batchFormatter">
        /// The formatter batching multiple log events into a payload that can be sent over the
        /// network. Default value is <see cref="ArrayBatchFormatter"/>.
        /// </param>
        /// <param name="restrictedToMinimumLevel">
        /// The minimum level for events passed through the sink. Default value is
        /// <see cref="LevelAlias.Minimum"/>.
        /// </param>
        /// <param name="httpClient">
        /// A custom <see cref="IHttpClient"/> implementation. Default value is
        /// <see cref="JsonHttpClient"/>.
        /// </param>
        /// <param name="configuration">
        /// Configuration passed to <paramref name="httpClient"/>. Parameter is either manually
        /// specified when configuring the sink in source code or automatically passed in when
        /// configuring the sink using
        /// <see href="https://www.nuget.org/packages/Serilog.Settings.Configuration">Serilog.Settings.Configuration</see>.
        /// </param>
        /// <returns>Logger configuration, allowing configuration to continue.</returns>
        public static LoggerConfiguration DurableHttpUsingTimeRolledBuffers(
            this LoggerSinkConfiguration sinkConfiguration,
            string requestUri,
            string bufferBaseFileName = "Buffer",
            BufferRollingInterval bufferRollingInterval = BufferRollingInterval.Day,
            long?bufferFileSizeLimitBytes    = null,
            bool bufferFileShared            = false,
            int?retainedBufferFileCountLimit = 31,
            long?logEventLimitBytes          = null,
            int?logEventsInBatchLimit        = 1000,
            long?batchSizeLimitBytes         = null,
            TimeSpan?period = null,
            ITextFormatter?textFormatter           = null,
            IBatchFormatter?batchFormatter         = null,
            LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
            IHttpClient?httpClient       = null,
            IConfiguration?configuration = null)
        {
            if (sinkConfiguration == null)
            {
                throw new ArgumentNullException(nameof(sinkConfiguration));
            }

            // Default values
            period ??= TimeSpan.FromSeconds(2);
            textFormatter ??= new NormalRenderedTextFormatter();
            batchFormatter ??= new ArrayBatchFormatter();
            httpClient ??= new JsonHttpClient();

            if (configuration != null)
            {
                httpClient.Configure(configuration);
            }

            var sink = new TimeRolledDurableHttpSink(
                requestUri: requestUri,
                bufferBaseFileName: bufferBaseFileName,
                bufferRollingInterval: bufferRollingInterval,
                bufferFileSizeLimitBytes: bufferFileSizeLimitBytes,
                bufferFileShared: bufferFileShared,
                retainedBufferFileCountLimit: retainedBufferFileCountLimit,
                logEventLimitBytes: logEventLimitBytes,
                logEventsInBatchLimit: logEventsInBatchLimit,
                batchSizeLimitBytes: batchSizeLimitBytes,
                period: period.Value,
                textFormatter: textFormatter,
                batchFormatter: batchFormatter,
                httpClient: httpClient);

            return(sinkConfiguration.Sink(sink, restrictedToMinimumLevel));
        }
        /// <summary>
        /// Adds a durable sink that sends log events using HTTP POST over the network. A durable
        /// sink will persist log events on disk in buffer files before sending them over the
        /// network, thus protecting against data loss after a system or process restart. The
        /// buffer files will use a rolling behavior defined by the time interval specified in
        /// <paramref name="bufferPathFormat"/>, i.e. a new buffer file is created every time a new
        /// interval is started. The maximum size of a file is defined by
        /// <paramref name="bufferFileSizeLimitBytes"/>, and when that limit is reached all
        /// incoming log events will be dropped until a new interval is started.
        /// </summary>
        /// <param name="sinkConfiguration">The logger configuration.</param>
        /// <param name="requestUri">The URI the request is sent to.</param>
        /// <param name="bufferPathFormat">
        /// The relative or absolute path format for a set of files that will be used to buffer
        /// events until they can be successfully sent over the network. Default value is
        /// "Buffer-{Date}.json". To use file rotation that is on an 30 or 60 minute interval pass
        /// "Buffer-{HalfHour}.json" or "Buffer-{Hour}.json".
        /// </param>
        /// <param name="bufferFileSizeLimitBytes">
        /// The approximate maximum size, in bytes, to which a buffer file for a specific time
        /// interval will be allowed to grow. By default no limit will be applied.
        /// </param>
        /// <param name="bufferFileShared">
        /// Allow the buffer file to be shared by multiple processes. Default value is false.
        /// </param>
        /// <param name="retainedBufferFileCountLimit">
        /// The maximum number of buffer files that will be retained, including the current buffer
        /// file. Under normal operation only 2 files will be kept, however if the log server is
        /// unreachable, the number of files specified by
        /// <paramref name="retainedBufferFileCountLimit"/> will be kept on the file system. For
        /// unlimited retention, pass null. Default value is 31.
        /// </param>
        /// <param name="batchPostingLimit">
        /// The maximum number of events to post in a single batch. Default value is 1000.
        /// </param>
        /// <param name="batchSizeLimitBytes">
        /// The approximate maximum size, in bytes, for a single batch. The value is an
        /// approximation because only the size of the log events are considered. The extra
        /// characters added by the batch formatter, where the sequence of serialized log events
        /// are transformed into a payload, are not considered. Please make sure to accommodate for
        /// those. Default value is long.MaxValue.
        /// </param>
        /// <param name="period">
        /// The time to wait between checking for event batches. Default value is 2 seconds.
        /// </param>
        /// <param name="textFormatter">
        /// The formatter rendering individual log events into text, for example JSON. Default
        /// value is <see cref="NormalRenderedTextFormatter"/>.
        /// </param>
        /// <param name="batchFormatter">
        /// The formatter batching multiple log events into a payload that can be sent over the
        /// network. Default value is <see cref="DefaultBatchFormatter"/>.
        /// </param>
        /// <param name="restrictedToMinimumLevel">
        /// The minimum level for events passed through the sink. Default value is
        /// <see cref="LevelAlias.Minimum"/>.
        /// </param>
        /// <param name="httpClient">
        /// A custom <see cref="IHttpClient"/> implementation. Default value is
        /// <see cref="HttpClient"/>.
        /// </param>
        /// <param name="configuration">
        /// Configuration passed to <paramref name="httpClient"/>. Parameter is either manually
        /// specified when configuring the sink in source code or automatically passed in when
        /// configuring the sink using
        /// <see href="https://www.nuget.org/packages/Serilog.Settings.Configuration">Serilog.Settings.Configuration</see>.
        /// </param>
        /// <returns>Logger configuration, allowing configuration to continue.</returns>
        public static LoggerConfiguration DurableHttpUsingTimeRolledBuffers(
            this LoggerSinkConfiguration sinkConfiguration,
            string requestUri,
            string bufferPathFormat          = "Buffer-{Date}.json",
            long?bufferFileSizeLimitBytes    = null,
            bool bufferFileShared            = false,
            int?retainedBufferFileCountLimit = 31,
            int batchPostingLimit            = 1000,
            long batchSizeLimitBytes         = long.MaxValue,
            TimeSpan?period = null,
            ITextFormatter textFormatter           = null,
            IBatchFormatter batchFormatter         = null,
            LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
            IHttpClient httpClient       = null,
            IConfiguration configuration = null)
        {
            if (sinkConfiguration == null)
            {
                throw new ArgumentNullException(nameof(sinkConfiguration));
            }

            // Default values
            period ??= TimeSpan.FromSeconds(2);
            textFormatter ??= new NormalRenderedTextFormatter();
            batchFormatter ??= new DefaultBatchFormatter();
            httpClient ??= new DefaultHttpClient();
            httpClient.Configure(configuration);

            var sink = new TimeRolledDurableHttpSink(
                requestUri: requestUri,
                bufferPathFormat: bufferPathFormat,
                bufferFileSizeLimitBytes: bufferFileSizeLimitBytes,
                bufferFileShared: bufferFileShared,
                retainedBufferFileCountLimit: retainedBufferFileCountLimit,
                batchPostingLimit: batchPostingLimit,
                batchSizeLimitBytes: batchSizeLimitBytes,
                period: period.Value,
                textFormatter: textFormatter,
                batchFormatter: batchFormatter,
                httpClient: httpClient);

            return(sinkConfiguration.Sink(sink, restrictedToMinimumLevel));
        }
Example #3
0
 public TimeRolledDurableHttpSinkReflection(Logger logger)
 {
     sink = logger.GetSink <TimeRolledDurableHttpSink>();
 }
        /// <summary>
        /// Adds a durable sink that sends log events using HTTP POST over the network. A durable
        /// sink will persist log events on disk in buffer files before sending them over the
        /// network, thus protecting against data loss after a system or process restart. The
        /// buffer files will use a rolling behavior defined by the time interval specified in
        /// <paramref name="bufferPathFormat"/>, i.e. a new buffer file is created every time a new
        /// interval is started. The maximum size of a file is defined by
        /// <paramref name="bufferFileSizeLimitBytes"/>, and when that limit is reached all
        /// incoming log events will be dropped until a new interval is started.
        /// </summary>
        /// <param name="sinkConfiguration">The logger configuration.</param>
        /// <param name="requestUri">The URI the request is sent to.</param>
        /// <param name="bufferPathFormat">
        /// The relative or absolute path format for a set of files that will be used to buffer
        /// events until they can be successfully sent over the network. Default value is
        /// "Buffer-{Date}.json". To use file rotation that is on an 30 or 60 minute interval pass
        /// "Buffer-{HalfHour}.json" or "Buffer-{Hour}.json".
        /// </param>
        /// <param name="bufferFileSizeLimitBytes">
        /// The approximate maximum size, in bytes, to which a buffer file for a specific time interval will be
        /// allowed to grow. By default no limit will be applied.
        /// </param>
        /// <param name="bufferFileShared">
        /// Allow the buffer file to be shared by multiple processes. Default value is false.
        /// </param>
        /// <param name="retainedBufferFileCountLimit">
        /// The maximum number of buffer files that will be retained, including the current buffer
        /// file. Under normal operation only 2 files will be kept, however if the log server is
        /// unreachable, the number of files specified by <paramref name="retainedBufferFileCountLimit"/>
        /// will be kept on the file system. For unlimited retention, pass null. Default value is 31.
        /// </param>
        /// <param name="batchPostingLimit">
        /// The maximum number of events to post in a single batch. Default value is 1000.
        /// </param>
        /// <param name="period">
        /// The time to wait between checking for event batches. Default value is 2 seconds.
        /// </param>
        /// <param name="textFormatter">
        /// The formatter rendering individual log events into text, for example JSON. Default
        /// value is <see cref="NormalRenderedTextFormatter"/>.
        /// </param>
        /// <param name="batchFormatter">
        /// The formatter batching multiple log events into a payload that can be sent over the
        /// network. Default value is <see cref="DefaultBatchFormatter"/>.
        /// </param>
        /// <param name="restrictedToMinimumLevel">
        /// The minimum level for events passed through the sink. Default value is
        /// <see cref="LevelAlias.Minimum"/>.
        /// </param>
        /// <param name="httpClient">
        /// A custom <see cref="IHttpClient"/> implementation. Default value is
        /// <see cref="HttpClient"/>.
        /// </param>
        /// <returns>Logger configuration, allowing configuration to continue.</returns>
        public static LoggerConfiguration Site24x7UsingTimeRolledBuffers(
            this LoggerSinkConfiguration sinkConfiguration,
            string requestUri,
            string minimumLogLevel           = null,
            string bufferPathFormat          = "Buffer-{Date}.json",
            long?bufferFileSizeLimitBytes    = null,
            bool bufferFileShared            = false,
            int?retainedBufferFileCountLimit = 31,
            int batchPostingLimit            = 1000,
            TimeSpan?period = null,
            ITextFormatter textFormatter   = null,
            IBatchFormatter batchFormatter = null,

            IHttpClient httpClient = null)
        {
            LogEventLevel restrictedToMinimumLevel = LogEventLevel.Verbose;

            if (minimumLogLevel == null)
            {
                restrictedToMinimumLevel = LogEventLevel.Verbose;
            }
            else if (minimumLogLevel == "Debug")
            {
                restrictedToMinimumLevel = LogEventLevel.Debug;
            }
            else if (minimumLogLevel == "Information")
            {
                restrictedToMinimumLevel = LogEventLevel.Information;
            }
            else if (minimumLogLevel == "Warning")
            {
                restrictedToMinimumLevel = LogEventLevel.Warning;
            }
            else if (minimumLogLevel == "Error")
            {
                restrictedToMinimumLevel = LogEventLevel.Error;
            }
            else if (minimumLogLevel == "Fatal")
            {
                restrictedToMinimumLevel = LogEventLevel.Fatal;
            }
            else
            {
                restrictedToMinimumLevel = LogEventLevel.Verbose;
            }

            if (sinkConfiguration == null)
            {
                throw new ArgumentNullException(nameof(sinkConfiguration));
            }

            // Default values
            period         = period ?? TimeSpan.FromMilliseconds(1);
            textFormatter  = textFormatter ?? new NormalRenderedTextFormatter();
            batchFormatter = batchFormatter ?? new DefaultBatchFormatter();
            httpClient     = httpClient ?? new DefaultHttpClient();

            var sink = new TimeRolledDurableHttpSink(
                requestUri: requestUri,
                bufferPathFormat: bufferPathFormat,
                bufferFileSizeLimitBytes: bufferFileSizeLimitBytes,
                bufferFileShared: bufferFileShared,
                retainedBufferFileCountLimit: retainedBufferFileCountLimit,
                batchPostingLimit: batchPostingLimit,
                period: period.Value,
                textFormatter: textFormatter,
                batchFormatter: batchFormatter,
                httpClient: httpClient);

            return(sinkConfiguration.Sink(sink, restrictedToMinimumLevel));
        }