收集一些 Net 常用的日志库,目前在用的是 Serilog 和 Log4Net

1、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
  1. 代码示例
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 运行时环境的产品。

代码示例:

  1. 添加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);
    }
}
  1. 记录日志
class Program
{
    static void Main(string[] args)
    { 
        Log4NetHelper.Info("这是一条Info级别的日志信息");
        Log4NetHelper.Error("这是一条Debug级别的日志信息");
    }
}

其它日志框架

框架名github地址
JSNLoghttps://github.com/mperdeck/jsnlog
Gelfhttps://github.com/mattwcole/gelf-extensions-logging
elmah.iohttps://github.com/elmahio/Elmah.Io.Extensions.Logging
KissLog.nethttps://github.com/KissLog-net/KissLog.Sdk
Sentryhttps://github.com/getsentry/sentry-dotnet
Stackdriverhttps://github.com/googleapis/google-cloud-dotnet