DicomServer/Desktop/Logging Serilog/Program.cs
2024-12-13 10:06:20 +08:00

98 lines
3.3 KiB
C#

// Copyright (c) 2012-2021 fo-dicom contributors.
// Licensed under the Microsoft Public License (MS-PL).
using System;
using Dicom.Log;
using Serilog;
using Serilog.Enrichers;
namespace Dicom.Demo.SerilogDemo
{
internal class Program
{
//Set this to false if Seq (http://getseq.net) is not present
private static bool useSeq = true;
private static void Main(string[] args)
{
var serilogManager = UseGlobalSerilogLogger();
// Initialize log manager.
LogManager.SetImplementation(serilogManager);
//Do some DICOM work
var file = DicomFile.Open(@"..\..\..\DICOM Media\Data\Patient1\2.dcm");
//Example of logging a dicom dataset
//file.Dataset.WriteToLog(LogManager.Default.GetLogger("dumpedDataset"), LogLevel.Info);
//Other logging using fo-dicom's log abstraction
Dicom.Log.Logger foDicomLogger = LogManager.GetLogger("testLog");
foDicomLogger.Fatal("A fatal message at {dateTime}", DateTime.Now);
foDicomLogger.Debug("A debug for file {filename} - info: {@metaInfo}", file.File.Name, file.FileMetaInfo);
Console.WriteLine("Finished - hit enter to exit");
Console.ReadLine();
}
private static SerilogManager UseSpecificSerilogLogger()
{
//Get a Serilog logger instance
var logger = ConfigureLogging();
//Wrap it in some extra context as an example
logger = logger.ForContext("Purpose", "Demonstration");
//Configure fo-dicom & Serilog
return new SerilogManager(logger);
}
private static SerilogManager UseGlobalSerilogLogger()
{
//Configure logging
ConfigureLogging();
//Configure fo-dicom & Serilog
return new SerilogManager();
}
/// <summary>
/// Create and return a serilog ILogger instance.
/// For convenience this also sets the global Serilog.Log instance
/// </summary>
/// <returns></returns>
public static ILogger ConfigureLogging()
{
var loggerConfig = new LoggerConfiguration()
//Enrich each log message with the machine name
.Enrich.With<MachineNameEnricher>()
//Accept verbose output (there is effectively no filter)
.MinimumLevel.Verbose()
//Write out to the console using the "Literate" console sink (colours the text based on the logged type)
.WriteTo.LiterateConsole()
//Also write out to a file based on the date and restrict these writes to warnings or worse (warning, error, fatal)
.WriteTo.RollingFile(@"Warnings_{Date}.txt", global::Serilog.Events.LogEventLevel.Warning);
if (useSeq)
{
//Send events to a default installation of Seq on the local computer
loggerConfig = loggerConfig.WriteTo.Seq("http://localhost:5341");
}
var logger = loggerConfig
//Take all of that configuration and make a logger
.CreateLogger();
//Stash the logger in the global Log instance for convenience
global::Serilog.Log.Logger = logger;
return logger;
}
}
}