.NET封装一个简单的单例模式异步的日志类

.NET兼职社区
可以直接使用,防止重复造轮子。

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

namespace Wpf.PersonnelNotice.Servers
{
    public sealed class LogService
    {
        private static readonly Lazy<LogService> lazy =
            new Lazy<LogService>(() =>
            {
                return new LogService();
            });

        public static LogService Instance { get { return lazy.Value; } }

        private string LogDirectory { get; set; }
        private string TimeDirName { get; set; }
        private string LogFileName { get; set; }
        private string FirstLogFileName { get; set; }
        private const long maxLogSize = 2 * 1024 * 1024; // 2 MB
        private string newFileName { get; set; }

        private bool _isInitialized = false;

        private LogService()
        {


            // 初始化
            LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");
            TimeDirName = DateTime.Now.ToString("yyyyMMdd");
            FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
        }
        public async Task WriteErrorLog(string message)
        {
            EnsureInitialized();
            await WriteLog("Error", message);
        }

        public async Task WriteInfoLog(string message)
        {
            EnsureInitialized();
            await WriteLog("Info", message);
        }
        private void EnsureInitialized()
        {
            if (!_isInitialized)
            {
                CreatLogDir("Log");
                _isInitialized = true;
            }
        }
        public async Task WriteLog(string logType, string message)
        {
            //创建文件夹
            string dirType = TimeDirName + "\\" + logType;
            CreatDir(dirType, LogDirectory);
            LogFileName = Path.Combine(LogDirectory, dirType, FirstLogFileName);
            if (!File.Exists(LogFileName))
            {
                using (StreamWriter sw = File.CreateText(LogFileName))
                {
                    await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                }
            }
            else
            {
                FileInfo fileInfo = new FileInfo(LogFileName);
                if (fileInfo.Length > maxLogSize)
                {
                    string newFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
                    FirstLogFileName = newFileName;
                    LogFileName = Path.Combine(LogDirectory, dirType, newFileName);
                    using (StreamWriter sw = File.CreateText(LogFileName))
                    {
                        await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                    }
                }
                else
                {
                    using (StreamWriter sw = File.AppendText(LogFileName))
                    {
                        await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");
                    }
                }
            }
        }


        public static void CreatLogDir(string name)
        {
            string rootDirectory = Directory.GetCurrentDirectory();
            Instance.CreatDir(name, rootDirectory);
        }

        // 将CreatDir方法改为非静态,因为在单例模式下由实例调用
        public bool CreatDir(string name, string path)
        {
            if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");
            if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");

            string logPath = Path.Combine(path, name);

            // 判断文件夹是否存在
            if (!Directory.Exists(logPath))
            {
                // 在当前项目根目录创建一个新的文件夹
                Directory.CreateDirectory(logPath);
                return true;
            }

            return false;
        }
    }
}


// 使用示例

LogService.Instance.WriteErrorLog("This is an error message.");
LogService.Instance.WriteInfoLog("This is an info message.");
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 RabbitMQ 帮助封装示例,使用 .NET 6: ```csharp using System; using System.Text; using RabbitMQ.Client; namespace RabbitMQHelper { public class RabbitMQHelper { private readonly string _hostName; private readonly int _port; private readonly string _userName; private readonly string _password; private readonly string _queueName; private readonly string _exchangeName; private readonly string _routingKey; private IConnection _connection; private IModel _channel; public RabbitMQHelper(string hostName, int port, string userName, string password, string queueName, string exchangeName, string routingKey) { _hostName = hostName; _port = port; _userName = userName; _password = password; _queueName = queueName; _exchangeName = exchangeName; _routingKey = routingKey; CreateConnection(); } private void CreateConnection() { var factory = new ConnectionFactory { HostName = _hostName, Port = _port, UserName = _userName, Password = _password }; _connection = factory.CreateConnection(); _channel = _connection.CreateModel(); _channel.ExchangeDeclare(_exchangeName, ExchangeType.Direct, durable: true); _channel.QueueDeclare(_queueName, durable: true, exclusive: false, autoDelete: false); _channel.QueueBind(_queueName, _exchangeName, _routingKey); } public void PublishMessage(string message) { var body = Encoding.UTF8.GetBytes(message); var properties = _channel.CreateBasicProperties(); properties.Persistent = true; _channel.BasicPublish(_exchangeName, _routingKey, properties, body); } public string ConsumeMessage() { var message = string.Empty; var consumer = new EventingBasicConsumer(_channel); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); message = Encoding.UTF8.GetString(body); }; _channel.BasicConsume(_queueName, true, consumer); return message; } public void CloseConnection() { _channel.Close(); _connection.Close(); } } } ``` 这个一个构造函数,需要传入 RabbitMQ 服务器的主机名、端口、用户名、密码、队列名、交换机名和路由键。然后,它会创建一个连接和一个通道,并使用这些参数声明交换机和队列,并将它们绑定在一起。`PublishMessage`方法可以用于发布消息,`ConsumeMessage`方法可以用于消费消息。最后,可以使用`CloseConnection`方法关闭连接。 使用示例: ```csharp using RabbitMQHelper; var rabbitMQHelper = new RabbitMQHelper("localhost", 5672, "guest", "guest", "my_queue", "my_exchange", "my_routing_key"); rabbitMQHelper.PublishMessage("Hello, RabbitMQ!"); var message = rabbitMQHelper.ConsumeMessage(); Console.WriteLine(message); rabbitMQHelper.CloseConnection(); ``` 这是一个简单的示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值