这里
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;
}
效果很好,但我不想有换行符“时间戳[级别] 消息”,所以我认为设置文件会很好,不必在代码中添加配置并编译我对设置所做的每个更改。
我认为您的配置文件格式错误。如果您希望 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