在WriteTo.Observer方法中,我想传递格式化日志消息,因为它是使用格式化模板呈现的。我该怎么做?谢谢
class Program
{
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile("log-{Date}.txt")
.WriteTo.Observers(events => events.Do(evt => { Console.WriteLine($"Observed event {evt.MessageTemplate.Text}"); }).Subscribe())
.WriteTo.Observers(events => events.Do(evt => { LogHandler(evt.MessageTemplate.Text);}).Subscribe())
.CreateLogger();
Log.Logger.Information("Log msg from Main");
Console.ReadLine();
}
public static void LogHandler(string logMsg)
{
Console.WriteLine("LogHandler: " + logMsg); //I want the complete formatted log message as it would appear in a file i.e. "[10:20:14 INF] Log msg from DoNothing"
}
}
Run Code Online (Sandbox Code Playgroud)
我自己解决了所有这些,以及我对Serilog遇到的其他几个问题。
我最初发布了有关NLog的问题,在解决过程中我发现了Serilog。我很高兴我做到了。
该答案说明了几个概念:
1.)从记录器中调用自定义处理程序
2.)格式化日志消息
3.)在日志消息中包括调用方法的名称。感谢和感谢@ MovGP0 在这里找到他的答案。
class Program
{
static void Main(string[] args)
{
var outputTemplate = "[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}in method {MemberName} at {FilePath}:{LineNumber}{NewLine}{Exception}{NewLine}";
Serilog.Formatting.Display.MessageTemplateTextFormatter tf = new Serilog.Formatting.Display.MessageTemplateTextFormatter(outputTemplate, CultureInfo.InvariantCulture);
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.CustomSink(tf, LogHandler)
.CreateLogger();
Log.Logger.Here().Information("Hello world");
Console.ReadLine();
}
public static void LogHandler(string logMsg)
{
Console.WriteLine("LogHandler: " + logMsg);
}
}
public class CustomSink : ILogEventSink
{
private readonly ITextFormatter _formatter;
private readonly Action<string>[] _handlers;
public CustomSink(ITextFormatter formatter, params Action<string>[] handlers)
{
_formatter = formatter;
_handlers = handlers;
}
public void Emit(LogEvent logEvent)
{
var buffer = new StringWriter(new StringBuilder(256));
_formatter.Format(logEvent, buffer);
string message = buffer.ToString();
foreach (Action<string> handler in _handlers)
handler(message);
}
}
public static class MySinkExtensions
{
public static LoggerConfiguration CustomSink(
this LoggerSinkConfiguration loggerConfiguration,
ITextFormatter formatter = null, params Action<string>[] handlers)
{
return loggerConfiguration.Sink(new CustomSink(formatter, handlers));
}
public static ILogger Here(this ILogger logger,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
return logger
.ForContext("MemberName", memberName)
.ForContext("FilePath", sourceFilePath)
.ForContext("LineNumber", sourceLineNumber);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1861 次 |
| 最近记录: |