Net常用的一些开源日志库
收集一些 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¶
简介: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 运行时环境的产品。
代码示例:
- 添加
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);
}
}
- 记录日志
其它日志框架¶
框架名 | 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 |