namespace System.Logging;
using System.Diagnostics.CodeAnalysis;
/// Log entries made fast (.NET's `LoggerMessage`): a template read once,
/// a delegate writing entries of it — no array of values made when its
/// level is off.
public static class LoggerMessage {
/// An entry of 0 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, Error?> Define(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 0);
return (logger, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[0]), error, FormattedLogValues.Message);
}
};
}
/// An entry of 1 value written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, Error?> Define<T1>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 1);
return (logger, arg1, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1 }), error, FormattedLogValues.Message);
}
};
}
/// An entry of 2 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, T2, Error?> Define<T1, T2>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 2);
return (logger, arg1, arg2, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1, arg2 }), error, FormattedLogValues.Message);
}
};
}
/// An entry of 3 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, T2, T3, Error?> Define<T1, T2, T3>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 3);
return (logger, arg1, arg2, arg3, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1, arg2, arg3 }), error, FormattedLogValues.Message);
}
};
}
/// An entry of 4 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, T2, T3, T4, Error?> Define<T1, T2, T3, T4>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 4);
return (logger, arg1, arg2, arg3, arg4, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1, arg2, arg3, arg4 }), error, FormattedLogValues.Message);
}
};
}
/// An entry of 5 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, T2, T3, T4, T5, Error?> Define<T1, T2, T3, T4, T5>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 5);
return (logger, arg1, arg2, arg3, arg4, arg5, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1, arg2, arg3, arg4, arg5 }), error, FormattedLogValues.Message);
}
};
}
/// An entry of 6 values written by a delegate made once: the
/// template read when it's defined, not at each entry.
[StructuredMessageTemplate(nameof(formatString))]
public static Action<ILogger, T1, T2, T3, T4, T5, T6, Error?> Define<T1, T2, T3, T4, T5, T6>(LogLevel logLevel, EventId eventId, string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 6);
return (logger, arg1, arg2, arg3, arg4, arg5, arg6, error) => {
if (logger.IsEnabled(logLevel)) {
logger.Log(logLevel, eventId, new FormattedLogValues(formatter, new object?[] { arg1, arg2, arg3, arg4, arg5, arg6 }), error, FormattedLogValues.Message);
}
};
}
/// A scope of 0 values begun by a delegate made once.
[StructuredMessageTemplate(nameof(formatString))]
public static Func<ILogger, IDisposable?> DefineScope(string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 0);
return (logger) => logger.BeginScope(new FormattedLogValues(formatter, new object?[0]));
}
/// A scope of 1 value begun by a delegate made once.
[StructuredMessageTemplate(nameof(formatString))]
public static Func<ILogger, T1, IDisposable?> DefineScope<T1>(string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 1);
return (logger, arg1) => logger.BeginScope(new FormattedLogValues(formatter, new object?[] { arg1 }));
}
/// A scope of 2 values begun by a delegate made once.
[StructuredMessageTemplate(nameof(formatString))]
public static Func<ILogger, T1, T2, IDisposable?> DefineScope<T1, T2>(string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 2);
return (logger, arg1, arg2) => logger.BeginScope(new FormattedLogValues(formatter, new object?[] { arg1, arg2 }));
}
/// A scope of 3 values begun by a delegate made once.
[StructuredMessageTemplate(nameof(formatString))]
public static Func<ILogger, T1, T2, T3, IDisposable?> DefineScope<T1, T2, T3>(string formatString) {
let formatter = new LogValuesFormatter(formatString);
Expect(formatter, 3);
return (logger, arg1, arg2, arg3) => logger.BeginScope(new FormattedLogValues(formatter, new object?[] { arg1, arg2, arg3 }));
}
/// A panic when `formatter`'s template hasn't `count` holes.
private static void Expect(LogValuesFormatter formatter, i32 count) {
if (formatter.ValueNames.Count != count) {
panic!("the message template has another number of holes than the values given");
}
}
}