web-dev-qa-db-fra.com

Configuration de Serilog pour écrire des journaux dans la table de base de données SQL Server

J'essaie de configurer Serilog pour écrire des journaux dans ma table db.

Voici la ventilation de ce que j'ai fait pour essayer de configurer la journalisation sur SQL Server.

1) Installez les packages Nuget, Serilog et Serilog.Sinks.MSSqlServer

2) J'ai mis en place une classe appelée Logger.cs qui héberge toute la configuration de Serilog:

public static class Logger
{
    private static readonly ILogger _Logger;

    static Logger()
    {

        var connStr = "data source=DESKTOP-BLAH;Initial Catalog=DBNAME;Trusted_Connection=True;";

        _Logger = new LoggerConfiguration()
            .WriteTo.MSSqlServer(connStr, "ApplicationLogs", 
            columnOptions: GetSqlColumnOptions(), restrictedToMinimumLevel: LogEventLevel.Debug, batchPostingLimit: 1)
            .CreateLogger();

        Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

    }

    public static ColumnOptions GetSqlColumnOptions()
    {
        var colOptions = new ColumnOptions();

        colOptions.Store.Remove(StandardColumn.Properties);
        colOptions.Store.Remove(StandardColumn.MessageTemplate);
        colOptions.Store.Remove(StandardColumn.Message);
        colOptions.Store.Remove(StandardColumn.Exception);
        colOptions.Store.Remove(StandardColumn.TimeStamp);
        colOptions.Store.Remove(StandardColumn.Level);

        colOptions.AdditionalDataColumns = new Collection<DataColumn>
        {
            new DataColumn{DataType = typeof(DateTime), ColumnName = "LogTimeStamp"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "RecordNum"},
            new DataColumn{DataType = typeof(string), ColumnName = "ComputerName"},
            new DataColumn{DataType = typeof(DateTime), ColumnName = "ProcessTimeStamp"},
            new DataColumn{DataType = typeof(string), ColumnName = "LogGroup"},
            new DataColumn{DataType = typeof(string), ColumnName = "Type"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "EventId"},
            new DataColumn{DataType = typeof(string), ColumnName = "UserId"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "Line"},
            new DataColumn{DataType = typeof(string), ColumnName = "Description"},
            new DataColumn{DataType = typeof(string), ColumnName = "Source"},
            new DataColumn{DataType = typeof(string), ColumnName = "Data"},
            new DataColumn{DataType = typeof(DateTime), ColumnName = "AddTimestamp"},
            new DataColumn{DataType = typeof(string), ColumnName = "DeviceID"}

        };
        return colOptions;
    }


    public static void WriteError(ApplicationLog infoToLog)
    {
        try
        {        
            _Logger.Error(LogEventLevel.Error,
                    "{LogTimestamp}{RecordNum}{ComputerName}{ProcessTimeStamp}{LogGroup}" +
                    "{Type}{EventId}{UserId}{Line}" +
                    "{Description}{Source}{Data}{AddTimestamp}{DeviceID}",
                    infoToLog.LogTimestamp, infoToLog.RecordNum,
                    infoToLog.ComputerName, infoToLog.ProcessTimestamp,
                    infoToLog.LogGroup, infoToLog.Type,
                    infoToLog.EventId, infoToLog.UserId,
                    infoToLog.Line, infoToLog.Description,
                    infoToLog.Source, infoToLog.Data,
                    infoToLog.AddTimestamp, infoToLog.DeviceId);
        }
        catch(Exception ex)
        {

        }
    }
}

3) Ensuite, je crois que je devrais être prêt à partir et je l'ai installé comme ceci:

ApplicationLog appLog = new ApplicationLog()
{
    LogTimestamp = DateTime.Now,
    RecordNum = 1,
    ComputerName = Environment.MachineName,
    ProcessTimestamp = DateTime.Now,
    LogGroup = "10",
    Type = "T",
    EventId = 23,
    UserId = Environment.UserName,
    Line = 0,
    Description = "Duplicate Failed to Upload",
    Source = "FooController.cs",
    Data = "DBNAME",
    AddTimestamp = DateTime.Now,
    DeviceId = "15"

};

Logger.WriteError(appLog);

4) J'ai déjà créé une table dans ma base de données et j'attends juste que les données de la journalisation soient remplies.

Cependant, il semble qu'il ne soit toujours pas enregistré dans ma table de base de données SQL Server.

Je me demande si j'ai raté des étapes ou ce que j'ai fait de mal pour la configuration ici?

10
Euridice01

Pouvez-vous essayer d'utiliser l'auto-journalisation de serilog pour voir ce qui se passe:

Si vous utilisez .net core, mettez ce qui suit dans Program.main ()

Serilog.Debugging.SelfLog.Enable(msg =>
{
Debug.Print(msg);
Debugger.Break();
});
1
mukesh joshi

Tu devrais écrire

_Logger.Dispose();

après

_Logger.Error(LogEventLevel.Error,
                "{LogTimestamp}{RecordNum}{ComputerName}{ProcessTimeStamp}{LogGroup}" +
                "{Type}{EventId}{UserId}{Line}" +
                "{Description}{Source}{Data}{AddTimestamp}{DeviceID}",
                infoToLog.LogTimestamp, infoToLog.RecordNum,
                infoToLog.ComputerName, infoToLog.ProcessTimestamp,
                infoToLog.LogGroup, infoToLog.Type,
                infoToLog.EventId, infoToLog.UserId,
                infoToLog.Line, infoToLog.Description,
                infoToLog.Source, infoToLog.Data,
                infoToLog.AddTimestamp, infoToLog.DeviceId);
0
B3HI13