Net常用的一些开源日志库
2024年6月10日大约 4 分钟
收集一些 Net 常用的日志库,目前在用的是 Serilog 和 Log4Net
1、Serilog
- github:https://github.com/serilog/serilog-sinks-console
- nuget:https://www.nuget.org/profiles/serilog
简介:Serilog 是一个现代化的日志库,它具有丰富的功能和简洁的 API。Serilog 支持多种输出目标,如控制台、文件、数据库等。Serilog 的一个接收器,通过标准输出将日志事件写入 Windows 控制台或 ANSI 终端。它支持颜色和自定义主题,包括在 macOS、Linux 和 Windows 10 上的 ANSI 256 色主题。默认输出是纯文本;可以使用诸如 Serilog.Formatting.Compact 之类的包插入 JSON 格式化功能。
1.添加包:
dotnet add package Serilog
dotnet add package Serilog.Sinks.File
dotnet add package Serilog.Sinks.Console
- 代码示例
using Serilog;
using Serilog.Formatting.Json;
class Program
{
static void Main(string[] args)
{
// 配置 Serilog
var loggerConfig = new LoggerConfiguration()
.WriteTo.Console(new JsonFormatter())
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day);
// 创建日志实例
var logger = loggerConfig.CreateLogger();
// 记录日志
logger.Information("这是一条Info级别的日志信息");
logger.Debug("这是一条Debug级别的日志信息");
}
}
写一个Helper类
public class LogHelper
{
static Logger logger = GetLogger();
static Logger GetLogger()
{
if (logger == null)
{
// 配置 Serilog
var loggerConfig = new LoggerConfiguration()
.WriteTo.File(CommonPath.LogFile, rollingInterval: RollingInterval.Day);
// 创建日志实例
logger = loggerConfig.CreateLogger();
}
return logger;
}
public static string CmdName = "";
public static void Info(string message)
{
if (!string.IsNullOrWhiteSpace(CmdName))
{
logger.Information($"{CmdName}: {message}");
}
else
{
logger.Information($"{message}");
}
}
public static void Warn(string message)
{
if (!string.IsNullOrWhiteSpace(CmdName))
{
logger.Warning($"{CmdName}: {message}");
}
else
{
logger.Warning($"{message}");
}
}
public static void Error(string message)
{
if (!string.IsNullOrWhiteSpace(CmdName))
{
logger.Error($"{CmdName}: {message}");
}
else
{
logger.Error($"{message}");
}
}
}
2、NLog
- github:https://github.com/NLog/NLog.Extensions.Logging
- nuget: https://www.nuget.org/packages/NLog
简介:NLog 是一个灵活且免费的日志记录平台,适用于包括.NET 标准在内的各种.NET 平台。NLog 可以轻松地将日志写入多个目标(数据库、文件、控制台),并实时更改日志配置。NLog 支持结构化和传统日志记录。NLog 的主要关注点在于:高性能、易于使用、易于扩展以及配置灵活。
using NLog;
using NLog.Config;
using NLog.Targets;
class Program
{
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
// 配置 NLog
var config = new LoggingConfiguration();
// 添加控制台目标
var consoleTarget = new ConsoleTarget();
config.AddTarget("console", consoleTarget);
// 添加文件目标
var fileTarget = new FileTarget();
config.AddTarget("file", fileTarget);
// 设置日志级别
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, consoleTarget));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, fileTarget));
// 应用配置
LogManager.Configuration = config;
// 记录日志
logger.Info("这是一条Info级别的日志信息");
logger.Debug("这是一条Debug级别的日志信息");
}
}
3、Log4Net
简介:log4net 是将出色的 Apache log4 框架移植到.NET 运行时环境的产品。
- 项目地址:https://github.com/apache/logging-log4net
- NuGet: https://www.nuget.org/packages/log4net
代码示例:
- 添加
log4net.config
文件,配置文件要复制到bin目录下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!--其中layout节点的配置说明:
%m(message):输出的日志消息;
%M 方法名
%n(newline):换行;
%d(datetime):输出当前语句运行的时刻;
%r(runtime):输出程序从运行到执行到当前语句时消耗的毫秒数;
%t(threadid):当前语句所在的线程ID ;
%p(priority): 日志的当前日志级别;
%c(class):当前日志对象的名称;
%L:输出语句所在的行号;
%l输出日志事件的发生位置
%F:输出语句所在的文件名;
%-10:表示最小长度为10,如果不够,则用空格填充;-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file />
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true" />
<!--log保留天数-->
<!--<param name= "MaxSizeRollBackups" value= "10" />-->
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false" />
<!--日志文件名格式为:2022-05-22.log-->
<param name= "DatePattern" value= "yyyy-MM-dd'.log'" />
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date" />
<layout type="log4net.Layout.PatternLayout">
<!--[日期]:-->
<param name="ConversionPattern" value="[%d][%p] %m %n" />
</layout>
</appender>
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<!--<appender-ref ref="ColoredConsoleAppender" />-->
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
2.写一个帮助类,全局可用
public class Log4NetHelper
{
private static ILog sLogger = null;
private readonly static ILog Logger = sLogger ?? (sLogger = InitILog());
private static ILog InitILog()
{
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string file = Path.Combine(dir, "log4net.config");
FileInfo info = new FileInfo(file);
XmlConfigurator.Configure(info);
var repository = LogManager.GetRepository();
var appenders = repository.GetAppenders();
if (appenders.Length != 0)
{
var targetApder = appenders.First(p => p.Name == "RollingLogFileAppender") as RollingFileAppender;
//targetApder.File = Path.Combine(dir, "Log\\");
targetApder.File = CommonPath.GetLogsDir();
targetApder.ActivateOptions();
}
return LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
}
public static void Info(string info)
{
Logger.Info(info);
}
public static void Error(string error)
{
Logger.Error(error);
}
public static void Warning(string warning)
{
Logger.Warn(warning);
}
}
- 记录日志
class Program
{
static void Main(string[] args)
{
Log4NetHelper.Info("这是一条Info级别的日志信息");
Log4NetHelper.Error("这是一条Debug级别的日志信息");
}
}
其它日志框架
框架名 | github地址 |
---|---|
JSNLog | https://github.com/mperdeck/jsnlog |
Gelf | https://github.com/mattwcole/gelf-extensions-logging |
elmah.io | https://github.com/elmahio/Elmah.Io.Extensions.Logging |
KissLog.net | https://github.com/KissLog-net/KissLog.Sdk |
Sentry | https://github.com/getsentry/sentry-dotnet |
Stackdriver | https://github.com/googleapis/google-cloud-dotnet |