在 C# 控制台应用程序上使用 Serilog 进行日志记录时无输出

问题描述 投票:0回答:1

这里

MyLoggerFactory.cs

using System;
using Microsoft.Extensions.Configuration;
using System.IO;
using Microsoft.Extensions.Logging;
using ILogger = Microsoft.Extensions.Logging.ILogger;
using ILoggerFactory = Microsoft.Extensions.Logging.ILoggerFactory;
using Serilog;
using Microsoft.Extensions.Logging.Configuration;

namespace ImportDolibarr.Helpers
{
    public class MyLoggerFactory
    {
        private static ILoggerFactory? _factory;
        private static readonly IConfigurationRoot configuration;
        static MyLoggerFactory()
        {
            configuration = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile($"logSettings.json", false, true)
                                .Build();
            EnsureLogsFolderExists();

            Serilog.Debugging.SelfLog.Enable(message => Console.WriteLine(message));

            ConfigureLogger();
        }

        private static void EnsureLogsFolderExists()
        {
            string logsFolderPath = Path.Combine(Directory.GetCurrentDirectory(), "Logs");

            if (!Directory.Exists(logsFolderPath))
            {
                Directory.CreateDirectory(logsFolderPath);
            }
        }

        internal static ILoggerFactory LoggerFactory
        {
            get => _factory ??= Microsoft.Extensions.Logging.LoggerFactory.Create(builder => { });
            set => _factory = value;
        }

        public static ILogger GetLogger()
        {
            Type? callingType = new System.Diagnostics.StackFrame(1)?.GetMethod()?.DeclaringType;

            if (callingType != null && callingType.FullName != null)
            {
                return LoggerFactory.CreateLogger(callingType.FullName);
            }
            else
            {
                return LoggerFactory.CreateLogger("UNKNOWN TYPE");
            }
        }

        private static void ConfigureLogger()
        {
            var logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();

            Log.Logger = logger;
            Console.WriteLine(configuration.GetDebugView());

            LoggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
            {
                builder.ClearProviders();
                builder.AddConfiguration(configuration.GetSection("Logging"));
                builder.AddSerilog(logger, dispose: true);
            });
        }

    }
}

这是我的

logSettings.json

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        },
        "Serilog": {
            "Using":  [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
            "MinimumLevel": {
                "Default": "Warning"
            },
            "Enrich": [
                "FromLogContext",
                "WithMachineName",
                "WithProcessId",
                "WithThreadId"
            ],
            "WriteTo": [
                {
                    "Name": "Console",
                    "Args": {
                        "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
                        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
                    }
                },
                {
                    "Name": "File",
                    "Args": {
                        "path": "Logs/Import-{Date}.log",
                        "rollingInterval": "Day",
                        "outputTemplate": "[{Timestamp:o}][{Level:u4}][{ThreadId}][{SourceContext}] {Message}{NewLine}{Exception}",
                        "rollOnFileSizeLimit": true,
                        "fileSizeLimitBytes": 4194304,
                        "retainedFileCountLimit": 10
                    }
                }
            ]
        }
    }
}

在任何课堂上我想记录我所做的事情:

private static readonly ILogger log = MyLoggerFactory.GetLogger();

.....

log.LogWarning($"Start process: {DateTime.Now}");

我没有收到任何错误,没有控制台输出,也没有在

Logs
文件夹上创建文件。

知道为什么吗?

我以前没有

logSettings.json
也没有
ConfigureLogger
方法。

只是

internal static ILoggerFactory LoggerFactory
{
 get => _factory ??= Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
 {
    builder.AddConsole();
    builder.AddFile(ImportHelper.ReadSetting("LogFile"));
 });
 set => _factory = value;
}

效果很好,但我不想有换行符“时间戳[级别] 消息”,所以我认为设置文件会很好,不必在代码中添加配置并编译我对设置所做的每个更改。

c# serilog
1个回答
0
投票

我认为您的配置文件格式错误。如果您希望 serilog 从您的配置文件中读取它应该是这样的:

{
"Serilog": {
    "Using": [
        "Serilog.Sinks.Console",
        "Serilog.Sinks.File"
    ],
    "MinimumLevel": "Information",
    "WriteTo": [
        {
            "Name": "Console",
            "Args": {
                "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
                "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
            }
        },
        {
            "Name": "File",
            "Args": {
                "Path": "Logs/Import-{Date}.log",
                "RestrictedToMinimumLevel": "Verbose",
                "OutputTemplate": "[{Timestamp:o}][{Level:u4}][{ThreadId}][{SourceContext}] {Message}{NewLine}{Exception}",
                "RollingInterval": "Day",
                "FileSizeLimitBytes": 5242880,
                "RollOnFileSizeLimit": "true",
                "retainedFileCountLimit": 10
            }
        }
    ],
    "Enrich": [
        "FromLogContext",
        "WithMachineName",
        "WithThreadId"
    ],
    "Destructure": [
        {
            "Name": "ToMaximumDepth",
            "Args": {
                "maximumDestructuringDepth": 4
            }
        },
        {
            "Name": "ToMaximumStringLength",
            "Args": {
                "maximumStringLength": 100
            }
        },
        {
            "Name": "ToMaximumCollectionCount",
            "Args": {
                "maximumCollectionCount": 10
            }
        }
    ],
    "Properties": {
        "Application": "Sample"
    }
}
}

那么您还必须更改线路:

configuration.GetSection("Serilog")

我修改了你的

.json
文件。你可以试试。

注意:确保您已安装:

Serilog.Sinks.Console
Serilog.Sinks.File

© www.soinside.com 2019 - 2024. All rights reserved.