c# 编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

使用 Markdown 格式,我将为您详细介绍如何编写一个异步写日志的实用工具类(LogAsyncWriter)。

LogAsyncWriter 类的设计

LogAsyncWriter 是一个轻量级的异步写日志工具类。它的设计主要包括以下内容:

属性

  • LogFilePath: 可读写的字符串属性,表示日志文件的完整路径。默认为项目根目录下的 log.txt 文件。

  • LogLevel: 枚举类型属性,表示日志输出的级别。默认为 Info

方法

  • Log(string msg): 接收一个字符串参数,直接将日志信息写入日志文件中。

  • Log(string msg, LogLevle level): 接收两个参数,第一个日志信息,第二个为日志级别,将日志信息按照指定日志级别写入日志文件中。

注意:日志级别的枚举类型可以自行定义,如:

public enum LogLevel {
    Debug,
    Info,
    Warning,
    Error
}

基本实现

using System;
using System.IO;
using System.Threading.Tasks;

public enum LogLevel {
    Debug,
    Info,
    Warning,
    Error
}

public class LogAsyncWriter {
    private static readonly object locker = new object();
    private string logFilePath;
    private LogLevel logLevel;

    public LogAsyncWriter(string logFilePath = "./log.txt", LogLevel logLevel = LogLevel.Info) {
        this.logFilePath = logFilePath;
        this.logLevel = logLevel;
    }

    public string LogFilePath {
        get { return logFilePath; }
        set { logFilePath = value; }
    }

    public LogLevel LogLevel {
        get { return logLevel; }
        set { logLevel = value; }
    }

    public async Task LogAsync(string msg, LogLevel level = LogLevel.Info) {
        if (level < LogLevel) return;

        var logMsg = $"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss.fff}][{level}] {msg}";

        await WriteAsync(logMsg);
    }

    private async Task WriteAsync(string msg) {
        await Task.Run(() => {
            lock (locker) {
                using (var writer = new StreamWriter(LogFilePath, append: true)) {
                    writer.WriteLine(msg);
                }
            }
        });
    }
}

上述代码使用 C# 实现了异步写日志的基本功能。其中,WriteAsync 方法使用 StreamWriter 写入日志文件,LogAsync 方法将日志信息按照指定的日志级别写入日志文件,LogLevel 控制日志输出的级别。

使用示例

using System;

class Program {
    static void Main(string[] args) {
        var logger = new LogAsyncWriter();

        logger.LogAsync("start My Application").Wait();

        try {
            // your code here
        } catch (Exception e) {
            logger.LogAsync(e.Message, LogLevel.Error).Wait();
        }

        logger.LogAsync("finish My Application").Wait();
    }
}

在上面的代码示例中,我们先实例化 LogAsyncWriter 类,并使用 LogAsync 方法记录日志。Wait() 方法将异步任务转化为同步的,以确保日志正确地写入。

再看一个使用事件的示例:

using System;

class Program {
    static void Main(string[] args) {
        var logger = new LogAsyncWriter();

        AppDomain.CurrentDomain.UnhandledException += (sender, e) => {
            var ex = (Exception)e.ExceptionObject;
            logger.LogAsync(ex.Message, LogLevel.Error).Wait();
        };

        logger.LogAsync("start My Application").Wait();

        try {
            // your code here
        } catch (Exception e) {
            logger.LogAsync(e.Message, LogLevel.Error).Wait();
        }

        logger.LogAsync("finish My Application").Wait();
    }
}

在这个示例中,我们注册了 UnhandledException 事件,可以在全局捕获未处理的异常,将其写入日志。无需使用 try-catch 块来捕获异常。

希望以上代码示例能够让您更好地使用 LogAsyncWriter 类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter) - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • .net6 在中标麒麟下的安装

    尝试了下.net6在信创环境下的安装和部署 信创服务器,CPU:ARM64,操作系统:中标麒麟 v10,网络环境:政务网(无法连接外网) 1、下载 .net 6 SDK 6.0.408 Arm64二进制文件。https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 2、在服务器/home目录下创建两个新目录…

    C# 2023年4月22日
    00
  • c# 怎样简洁高效的实现多个 Enum 自由转换

    C#怎样简洁高效的实现多个Enum自由转换 在C#中,Enum是一种常用的数据类型,它可以用于定义一组常量。在实际开发中,我们经常需要将不同的Enum类型进行转换,以便在不同的上下文中使用。本文将介绍如何使用C#实现多个Enum自由转换,并提供两个示例来演示如何使用这些技术。 示例1:使用扩展方法实现Enum转换 以下是使用扩展方法实现Enum转换的步骤: …

    C# 2023年5月15日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)

     Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三…

    C# 2023年4月17日
    00
  • vs2010怎么自定义的模板?

    下面是vs2010自定义模板的完整攻略: 1. 创建模板文件 VS2010中的模板都存放在指定的文件夹中,我们可以直接把自己编写的模板文件放在这个文件夹中。模板文件夹的位置是:C:\Users\用户名\Documents\Visual Studio 2010\Templates,进入文件夹后可以看到很多已有的模板。 我们可以在模板文件夹中创建一个新的文件夹,…

    C# 2023年6月6日
    00
  • c#中Linq to Sql 增删除的实例

    对于“c#中Linq to Sql 增删改查的实例”,我可以提供以下攻略: 1. Linq to Sql 概述 LINQ to SQL是用于访问关系数据库的组件,提供了基于LINQ语法的查询、插入、更新和删除操作,使得访问数据库时,可以像访问集合一样使用LINQ语句,从而更加方便和简洁。 Linq to Sql与数据库之间的映射通过数据上下文类实现,其提供了…

    C# 2023年5月31日
    00
  • 利用C#实现合并Word文档功能

    实现合并Word文档功能主要涉及到以下几个步骤: 1. 安装OpenXML SDK OpenXML SDK是用于处理Office文件的开源API,我们可以使用它来处理Word文档。 安装方法: 在Visual Studio中打开NuGet包管理器(Tools -> NuGet Package Manager -> Manage NuGet Pac…

    C# 2023年6月1日
    00
  • C#实现屏幕拷贝的方法

    若想在C#应用程序中实现屏幕拷贝功能,需要涉及到以下几个步骤: 1. 引用相关命名空间 使用屏幕拷贝功能需要使用System.Drawing和System.Windows.Forms命名空间中的类,需要确保它们被引用。 using System.Drawing; using System.Drawing.Imaging; using System.Windo…

    C# 2023年6月6日
    00
  • ASP.NET Core 6框架揭秘实例演示之如何承载你的后台服务

    ASP.NET Core 6是一款高效、开源的Web应用程序框架,支持多平台和云端部署,且拥有可扩展的体系结构,非常适合构建现代化的Web应用程序。本文将基于该框架,详细讲解如何承载你的后台服务,针对不同的应用场景,提供多条实例演示。 一、使用ASP.NET Core 6承载后台任务 在Web应用程序中,有很多后台任务需要执行。例如,订阅事件、启用定时任务、…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部