先引入Nuget包如下五个:
1、Serilog
2、Serilog.Sinks.Async
3、Serilog.Sinks.Console
4、Serilog.Sinks.EventLog
5、Serilog.Sinks.File
新建一个SeriLogHelper类
public class SeriLogHelper
{
/// <summary>
/// 这段代码实现了一个使用 Serilog 记录日志的类 Logger。该类通过使用 Serilog 的 ILogger 和 LoggerConfiguration 实现了自定义的日志记录选项。在此基础上,Logger 还提供了一个 AppendLog 方法,可以将指定的日志消息添加到日志记录器中,并将其写入到日志文件中。同时,Logger 支持多进程共享日志文件,以解决多进程并发写入日志文件的问题。通过这些功能,Logger 类可以实现高效、可靠、线程安全的日志记录,并能够满足复杂的应用程序日志记录需求。
/// </summary>
public class Logger
{
private ILogger logger;
/// <summary>
/// 实例化ILogger
/// </summary>
/// <param name="ProjectName">该实例保存文件夹名称</param>
public Logger(string ProjectName)
{
// 为每个线程创建独立的日志记录器,日志文件夹以项目名称命名
logger = new LoggerConfiguration()
.MinimumLevel.Debug() // 设置最低日志级别
.MinimumLevel.Override("System", LogEventLevel.Information)
.WriteTo.Console() // 输出日志到控制台
.WriteTo.EventLog("Application", restrictedToMinimumLevel: LogEventLevel.Warning)//将日志写入 Windows 事件日志
.WriteTo.Logger(Ic => ConfigureSerilog(Ic, ProjectName))
// 输出日志到文件,文件名中包含线程 ID
.CreateLogger();// 构造日志记录器
}
/// <summary>
/// 日志配置
/// </summary>
/// <param name="loggerConfiguration"></param>
/// <param name="ProjectName"></param>
public void ConfigureSerilog(LoggerConfiguration loggerConfiguration, string ProjectName)
{
loggerConfiguration
.WriteTo.Logger(config => config
.WriteTo.Async(a => a//异步写入
.File(
"SeriLog/" + ProjectName + "/.txt",
// 设置日志输出到文件中,文件名按天滚动,文件夹名称为日期加小时
rollingInterval: RollingInterval.Day,
rollOnFileSizeLimit: true,// 设置为 true,表示启用日志文件大小限制,当日志文件达到设定的大小后,会自动滚动到新的文件中。
fileSizeLimitBytes: 10_000_000, //设置每个日志文件的最大大小,单位是字节。这里的值是 10MB,即 10_000_000 字节。
retainedFileCountLimit: 200,//设置保留的日志文件数量上限,这里是 200,即最多保留最新的 200 个日志文件。
retainedFileTimeLimit: TimeSpan.FromDays(7),//设置日志文件的最长保留时间,这里是 7 天。
shared: true, // 多进程共享文件
// 设置日志输出模板,包括时间戳、日志级别、日志消息、日志来源和异常信息
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {NewLine}{Exception}"
)
));
}
/// <summary>
/// 新增日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="logLevel">日志级别</param>
public void AppendLog(string message, LogLevel logLevel = LogLevel.Info)
{
switch (logLevel)
{
case LogLevel.Info:
logger.Information(message);
break;
case LogLevel.Warning:
logger.Warning(message);
break;
case LogLevel.Error:
logger.Error(message);
break;
case LogLevel.Debug:
logger.Debug(message);
break;
case LogLevel.Fatal:
logger.Fatal(message);
break;
}
}
}
/// <summary>
/// 日志级别
/// </summary>
public enum LogLevel
{
Info, Warning, Error, Debug, Fatal
}
}
调用实例如下
SeriLogHelper.Logger serilog1 = new SeriLogHelper.Logger("serilogInfo");
SeriLogHelper.Logger serilog2 = new SeriLogHelper.Logger("serilog1");
SeriLogHelper.Logger serilog3 = new SeriLogHelper.Logger("serilog2");
SeriLogHelper.Logger serilog4 = new SeriLogHelper.Logger("serilog3");
serilog1.AppendLog($"启动服务成功");
Task.Factory.StartNew(() =>
{
serilog2.AppendLog($"线程日志1开始");
for (int k = 0; k < 5; k++)
{
serilog2.AppendLog($"【线程{Task.CurrentId}】这是第{k}条日志消息");
}
serilog2.AppendLog($"线程日志1结束");
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() =>
{
serilog3.AppendLog($"线程日志2开始");
for (int k = 0; k < 5; k++)
{
serilog3.AppendLog($"【线程{Task.CurrentId}】这是第{k}条日志消息");
}
serilog3.AppendLog($"线程日志2结束");
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() =>
{
serilog4.AppendLog($"线程日志3开始");
for (int k = 0; k < 5; k++)
{
serilog4.AppendLog($"【线程{Task.CurrentId}】这是第{k}条日志消息");
}
serilog4.AppendLog($"线程日志3结束");
}, TaskCreationOptions.LongRunning);
serilog1.AppendLog($"停止服务成功");
作者:是孤千羽吖!
转载请加上原文地址:https://blog.csdn.net/qianjue427/article/details/130839818?spm=1001.2014.3001.5502