跳转至

Net常用的一些开源日志库

收集一些 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地址
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

评论