Skip to content

Commit d9abe15

Browse files
authored
Merge pull request #61 from nblumhardt/dev
3.1.0 Release
2 parents f28e5f7 + 351094f commit d9abe15

6 files changed

Lines changed: 80 additions & 11 deletions

File tree

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ artifacts:
99
deploy:
1010
- provider: NuGet
1111
api_key:
12-
secure: 6m2isg5p2eMqbdrcnt0CXpgN0G3QMoUiRZsrSHJx94gSUECf8xl+zvwkFLmZYRSI
12+
secure: PNt/eGIH1e+7YX5jjXKmBDz4QKZ6RvpoIkTz1SYzJJHPYBUnzGY0EiBH9ylG19is
1313
skip_symbols: true
1414
on:
1515
branch: /^(dev|main)$/

src/SerilogTimings/Configuration/LevelledOperation.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using Serilog;
16+
using Serilog.Core;
1617
using Serilog.Events;
1718

1819
namespace SerilogTimings.Configuration
@@ -59,6 +60,7 @@ internal LevelledOperation(ILogger logger, LogEventLevel completion, LogEventLev
5960
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
6061
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
6162
/// <returns>An <see cref="Operation"/> object.</returns>
63+
[MessageTemplateFormatMethod("messageTemplate")]
6264
public Operation Begin(string messageTemplate, params object[] args)
6365
{
6466
return _cachedResult ?? new Operation(_logger!, messageTemplate, args, CompletionBehaviour.Abandon, _completion, _abandonment, _warningThreshold);
@@ -71,6 +73,7 @@ public Operation Begin(string messageTemplate, params object[] args)
7173
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
7274
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
7375
/// <returns>An <see cref="Operation"/> object.</returns>
76+
[MessageTemplateFormatMethod("messageTemplate")]
7477
public IDisposable Time(string messageTemplate, params object[] args)
7578
{
7679
return _cachedResult ?? new Operation(_logger!, messageTemplate, args, CompletionBehaviour.Complete, _completion, _abandonment, _warningThreshold);

src/SerilogTimings/Extensions/LoggerOperationExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using Serilog;
16+
using Serilog.Core;
1617
using Serilog.Events;
1718
using SerilogTimings.Configuration;
1819

@@ -31,6 +32,7 @@ public static class LoggerOperationExtensions
3132
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
3233
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
3334
/// <returns>An <see cref="Operation"/> object.</returns>
35+
[MessageTemplateFormatMethod("messageTemplate")]
3436
public static IDisposable TimeOperation(this ILogger logger, string messageTemplate, params object[] args)
3537
{
3638
return new Operation(logger, messageTemplate, args, CompletionBehaviour.Complete, LogEventLevel.Information, LogEventLevel.Warning);
@@ -45,6 +47,7 @@ public static IDisposable TimeOperation(this ILogger logger, string messageTempl
4547
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
4648
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
4749
/// <returns>An <see cref="Operation"/> object.</returns>
50+
[MessageTemplateFormatMethod("messageTemplate")]
4851
public static Operation BeginOperation(this ILogger logger, string messageTemplate, params object[] args)
4952
{
5053
return new Operation(logger, messageTemplate, args, CompletionBehaviour.Abandon, LogEventLevel.Information, LogEventLevel.Warning);

src/SerilogTimings/Operation.cs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public enum Properties
6969
readonly LogEventLevel _abandonmentLevel;
7070
readonly TimeSpan? _warningThreshold;
7171
Exception? _exception;
72-
72+
7373
internal Operation(ILogger target, string messageTemplate, object[] args,
7474
CompletionBehaviour completionBehaviour, LogEventLevel completionLevel, LogEventLevel abandonmentLevel,
7575
TimeSpan? warningThreshold = null)
@@ -98,6 +98,7 @@ static long GetTimestamp()
9898
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
9999
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
100100
/// <returns>An <see cref="Operation"/> object.</returns>
101+
[MessageTemplateFormatMethod("messageTemplate")]
101102
public static Operation Begin(string messageTemplate, params object[] args)
102103
{
103104
return Log.Logger.BeginOperation(messageTemplate, args);
@@ -110,6 +111,7 @@ public static Operation Begin(string messageTemplate, params object[] args)
110111
/// <param name="args">Arguments to the log message. These will be stored and captured only when the
111112
/// operation completes, so do not pass arguments that are mutated during the operation.</param>
112113
/// <returns>An <see cref="Operation"/> object.</returns>
114+
[MessageTemplateFormatMethod("messageTemplate")]
113115
public static IDisposable Time(string messageTemplate, params object[] args)
114116
{
115117
return Log.Logger.TimeOperation(messageTemplate, args);
@@ -147,7 +149,7 @@ public TimeSpan Elapsed
147149
// (HAL) on machines with variable-speed CPUs (e.g. Intel SpeedStep).
148150
return TimeSpan.Zero;
149151
}
150-
152+
151153
return TimeSpan.FromTicks(elapsedTicks);
152154
}
153155
}
@@ -163,6 +165,20 @@ public void Complete()
163165
Write(_target, _completionLevel, OutcomeCompleted);
164166
}
165167

168+
/// <summary>
169+
/// Complete the timed operation with the given Log Event level. This will write the event and elapsed time to the log.
170+
/// </summary>
171+
/// <param name="level">The log event level with which the complete operation will be logged</param>
172+
173+
public void Complete(LogEventLevel level)
174+
{
175+
if (_completionBehaviour == CompletionBehaviour.Silent)
176+
return;
177+
178+
Write(_target, level, OutcomeCompleted);
179+
}
180+
181+
166182
/// <summary>
167183
/// Complete the timed operation with an included result value.
168184
/// </summary>
@@ -179,6 +195,23 @@ public void Complete(string resultPropertyName, object result, bool destructureO
179195
Write(_target.ForContext(resultPropertyName, result, destructureObjects), _completionLevel, OutcomeCompleted);
180196
}
181197

198+
/// <summary>
199+
/// Complete the timed operation with an included result value and log event level.
200+
/// </summary>
201+
/// <param name="level">The log event level with which the complete operation will be logged</param>
202+
/// <param name="resultPropertyName">The name for the property to attach to the event.</param>
203+
/// <param name="result">The result value.</param>
204+
/// <param name="destructureObjects">If true, the property value will be destructured (serialized).</param>
205+
public void Complete(string resultPropertyName, object result, LogEventLevel level, bool destructureObjects = false)
206+
{
207+
if (resultPropertyName == null) throw new ArgumentNullException(nameof(resultPropertyName));
208+
209+
if (_completionBehaviour == CompletionBehaviour.Silent)
210+
return;
211+
212+
Write(_target.ForContext(resultPropertyName, result, destructureObjects), level, OutcomeCompleted);
213+
}
214+
182215
/// <summary>
183216
/// Abandon the timed operation. This will write the event and elapsed time to the log.
184217
/// </summary>
@@ -243,10 +276,10 @@ void Write(ILogger target, LogEventLevel level, string outcome)
243276
_completionBehaviour = CompletionBehaviour.Silent;
244277

245278
var elapsed = Elapsed.TotalMilliseconds;
246-
279+
247280
level = elapsed > _warningThreshold?.TotalMilliseconds && level < LogEventLevel.Warning
248281
? LogEventLevel.Warning
249-
: level;
282+
: level;
250283

251284
target.Write(level, _exception, $"{_messageTemplate} {{{nameof(Properties.Outcome)}}} in {{{nameof(Properties.Elapsed)}:0.0}} ms", _args.Concat(new object[] { outcome, elapsed }).ToArray());
252285

src/SerilogTimings/SerilogTimings.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Description>Extend Serilog with timed operations.</Description>
5-
<VersionPrefix>3.0.1</VersionPrefix>
5+
<VersionPrefix>3.1.0</VersionPrefix>
66
<Authors>nblumhardt;SerilogTimings Contributors</Authors>
77
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
88
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

test/SerilogTimings.Tests/OperationTests.cs

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using System;
2-
using System.Linq;
3-
using System.Threading.Tasks;
4-
using Serilog;
1+
using Serilog;
52
using Serilog.Events;
63
using SerilogTimings.Extensions;
74
using SerilogTimings.Tests.Support;
5+
using System;
6+
using System.Linq;
7+
using System.Threading.Tasks;
88
using Xunit;
99

1010
namespace SerilogTimings.Tests
@@ -94,6 +94,36 @@ public void CompleteRecordsResultsOfOperations()
9494
Assert.True(logger.Events.Single().Properties.ContainsKey("Value"));
9595
}
9696

97+
[Fact]
98+
public void CompleteRecordsResultsOfOperationsWithGivenLogLevel()
99+
{
100+
var logger = new CollectingLogger();
101+
var op = logger.Logger.BeginOperation("Test");
102+
op.Complete("Value", 42, LogEventLevel.Warning);
103+
Assert.Single(logger.Events);
104+
Assert.True(logger.Events.Single().Properties.ContainsKey("Value"));
105+
Assert.Equal(LogEventLevel.Warning, logger.Events.Single().Level);
106+
}
107+
108+
[Fact]
109+
public void CompletesWithGivenLogLevel()
110+
{
111+
var logger = new CollectingLogger();
112+
var op = logger.Logger.BeginOperation("Test");
113+
op.Complete(LogEventLevel.Error);
114+
Assert.Equal(LogEventLevel.Error, logger.Events.Single().Level);
115+
}
116+
117+
[Fact]
118+
public void DoesNotCompleteWithGivenLevelIfAbandonedBeforehand()
119+
{
120+
var logger = new CollectingLogger();
121+
var op = logger.Logger.BeginOperation("Test");
122+
op.Abandon();
123+
op.Complete(LogEventLevel.Error);
124+
Assert.Equal(LogEventLevel.Warning, logger.Events.Single().Level);
125+
}
126+
97127
[Fact]
98128
public void OnceCanceledDisposeDoesNotRecordCompletionOfOperations()
99129
{
@@ -271,7 +301,7 @@ public async Task ElapsedUpdatesDuringOperation()
271301
Assert.Equal(third, fourth);
272302
Assert.Equal(fourth, fifth);
273303
}
274-
304+
275305
[Fact]
276306
public async Task LongOperationsAreLoggedAsWarnings()
277307
{

0 commit comments

Comments
 (0)