返回顶部
首页 > 资讯 > 精选 >.Net Core如何使用Logger实现log写入本地文件系统
  • 645
分享到

.Net Core如何使用Logger实现log写入本地文件系统

2023-07-02 09:07:38 645人浏览 泡泡鱼
摘要

这篇“.net Core如何使用Logger实现log写入本地文件系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇

这篇“.net Core如何使用Logger实现log写入本地文件系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“.Net Core如何使用Logger实现log写入本地文件系统”文章吧。

.net core 自带一个基础的logger框架Microsoft.Extensions.Logging。

微软默认实现了Microsoft.Extensions.Logging.Console.dll。控制台的日志输出和Microsoft.Extensions.Logging.Debug.dll调试输出。

logger框架主要几个类:LoggerFactory,Logger,LoggerProvider。

看名字就很好理解,都不需要解释。

实现我们自己的file logger只需要实现logger,loggerProvider即可。

第一步:入口。

loggerFactory.AddFile(this.Configuration.GetSection("FileLogging"));

为LoggerFactory扩张一个方法,提供增加日志写文件方式的入口。相关的配置来自appsettings.JSON

    public static class FileLoggerExtensions    {        //add 日志文件创建规则,分割规则,格式化规则,过滤规则 to appsettings.json        public static ILoggerFactory AddFile(this ILoggerFactory factory, IConfiguration configuration)        {            return AddFile(factory, new FileLoggerSettings(configuration));        }        public static ILoggerFactory AddFile(this ILoggerFactory factory, FileLoggerSettings fileLoggerSettings)        {            factory.AddProvider(new FileLoggerProvider(fileLoggerSettings));            return factory;        }    }

第二步:实现我们的logger提供程序,实现ILoggerProvider接口

public class FileLoggerProvider : ILoggerProvider, Idisposable

关键方法CreateLogger,创建真正写日志的logger。对当前的logger可以做适当的缓存,配置logger

    public class FileLoggerProvider : ILoggerProvider, IDisposable    {        FileLoggerSettings _configuration;        readonly ConcurrentDictionary<string, InitLoggerModel> _loggerKeys = new ConcurrentDictionary<string, InitLoggerModel>();        readonly ConcurrentDictionary<string, FileLogger> _loggers = new ConcurrentDictionary<string, FileLogger>();        public FileLoggerProvider(FileLoggerSettings configuration)        {            _configuration = configuration;            _configuration.ChangeToken.ReGISterChangeCallback(p =>            {                //appsettings.json changed. reload settings.                _configuration.Reload();                //update loggers settings fORM new settings                foreach (var item in this._loggers.Values)                {                    InitLoggerModel model = new InitLoggerModel();                    InitLoggerSettings(item.Name, model);                    InitLogger(model, item);                }            }, null);        }        public ILogger CreateLogger(string cateGoryName)        {            var loggerKey = this._loggerKeys.GetOrAdd(categoryName, p =>             {                 InitLoggerModel model = new InitLoggerModel();                 InitLoggerSettings(categoryName, model);                 return model;             });            var key = loggerKey.FileDiretoryPath + loggerKey.FileNameTemplate;            return this._loggers.GetOrAdd(key, p =>            {                var logger = new FileLogger(categoryName);                InitLogger(loggerKey, logger);                return logger;            });        }        private static void InitLogger(InitLoggerModel model, FileLogger logger)        {            logger.FileNameTemplate = model.FileNameTemplate;            logger.FileDiretoryPath = model.FileDiretoryPath;            logger.MinLevel = model.MinLevel;        }        class InitLoggerModel        {            public LogLevel MinLevel { get; set; }            public string FileDiretoryPath { get; set; }            public string FileNameTemplate { get; set; }            public override int GetHashCode()            {                return this.MinLevel.GetHashCode() + this.FileDiretoryPath.GetHashCode() + this.FileNameTemplate.GetHashCode();            }            public override bool Equals(object obj)            {                var b = obj as InitLoggerModel;                if (b == null)                    return false;                return this.MinLevel == b.MinLevel && this.FileDiretoryPath == b.FileDiretoryPath && this.FileNameTemplate == b.FileNameTemplate;            }        }        private void InitLoggerSettings(string categoryName, InitLoggerModel model)        {            model.MinLevel = LogLevel.Debug;            var keys = this.GeTKEys(categoryName);            foreach (var item in keys)            {                var switchV = _configuration.GetSwitch(item);                if (switchV.Item1)                {                    model.MinLevel = switchV.Item2;                    break;                }            }            model.FileDiretoryPath = this._configuration.DefaultPath;            foreach (var item in keys)            {                var switchV = _configuration.GetDiretoryPath(item);                if (switchV.Item1)                {                    model.FileDiretoryPath = switchV.Item2;                    break;                }            }            model.FileNameTemplate = this._configuration.DefaultFileName;            foreach (var item in keys)            {                var switchV = _configuration.GetFileName(item);                if (switchV.Item1)                {                    model.FileNameTemplate = switchV.Item2;                    break;                }            }        }        IEnumerable<string> GetKeys(string categoryName)        {            while (!String.IsNullOrEmpty(categoryName))            {                // a.b.c                //--result                // a.b.c,a.b,a,Default                yield return categoryName;                var last = categoryName.LastIndexOf('.');                if (last <= 0)                {                    yield return "Default";                    yield break;                }                System.Diagnostics.Debug.WriteLine(categoryName + "--" + last);                categoryName = categoryName.Substring(0, last);            }            yield break;        }        public void Dispose()        {        }    }

第三步:实现我们的logger,实现ILogger接口。真正将log写入file

public class FileLogger : Ilogger

    public class FileLogger : ILogger    {        static protected string delimiter = new string(new char[] { (char)1 });        public FileLogger(string categoryName)        {            this.Name = categoryName;        }        class Disposable : IDisposable        {            public void Dispose()            {            }        }        Disposable _DisposableInstance = new Disposable();        public IDisposable BeginScope<TState>(TState state)        {            return _DisposableInstance;        }        public bool IsEnabled(LogLevel logLevel)        {            return this.MinLevel <= logLevel;        }        public void Reload()        {            _Expires = true;        }        public string Name { get; private set; }        public LogLevel MinLevel { get; set; }        public string FileDiretoryPath { get; set; }        public string FileNameTemplate { get; set; }        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)        {            if (!this.IsEnabled(logLevel))                return;            var msg = formatter(state, exception);            this.Write(logLevel, eventId, msg, exception);        }        void Write(LogLevel logLevel, EventId eventId, string message, Exception ex)        {            EnsureInitFile();            //TODO 提高效率 队列写!!!            var log = String.Concat(DateTime.Now.ToString("HH:mm:ss"), '[', logLevel.ToString(), ']', '[',                  Thread.CurrentThread.ManagedThreadId.ToString(), ',', eventId.Id.ToString(), ',', eventId.Name, ']',                  delimiter, message, delimiter, ex?.ToString());            lock (this)            {                this._sw.WriteLine(log);            }        }        bool _Expires = true;        string _FileName;        protected StreamWriter _sw;        void EnsureInitFile()        {            if (CheckNeedCreateNewFile())            {                lock (this)                {                    if (CheckNeedCreateNewFile())                    {                        InitFile();                        _Expires = false;                    }                }            }        }        bool CheckNeedCreateNewFile()        {            if (_Expires)            {                return true;            }            //TODO 使用 RollingType判断是否需要创建文件。提高效率!!!            if (_FileName != DateTime.Now.ToString(this.FileNameTemplate))            {                return true;            }            return false;        }        void InitFile()        {            if (!Directory.Exists(this.FileDiretoryPath))            {                Directory.CreateDirectory(this.FileDiretoryPath);            }            var path = "";            int i = 0;            do            {                _FileName = DateTime.Now.ToString(this.FileNameTemplate);                path = Path.Combine(this.FileDiretoryPath, _FileName + "_" + i + ".log");                i++;            } while (System.IO.File.Exists(path));            var oldsw = _sw;            _sw = new StreamWriter(new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.Read), Encoding.UTF8);            _sw.AutoFlush = true;            if (oldsw != null)            {                try                {                    _sw.Flush();                    _sw.Dispose();                }                catch                {                }            }        }    }

以上就是关于“.Net Core如何使用Logger实现log写入本地文件系统”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: .Net Core如何使用Logger实现log写入本地文件系统

本文链接: https://lsjlt.com/news/341125.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .Net Core使用Logger实现log写入本地文件系统
    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging。 微软默认实现了Microsoft.Extensions.Log...
    99+
    2024-04-02
  • .Net Core如何使用Logger实现log写入本地文件系统
    这篇“.Net Core如何使用Logger实现log写入本地文件系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-07-02
  • 如何使用ByteArrayOutputStream实现将数据写入本地文件
    这篇文章主要为大家展示了“如何使用ByteArrayOutputStream实现将数据写入本地文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用ByteArrayOutputStream...
    99+
    2023-06-22
  • 如何使用h5+js实现本地文件读取和写入
    小编给大家分享一下如何使用h5+js实现本地文件读取和写入,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   代码如下:   读取本地文件   <!doctypehtml>...
    99+
    2024-04-02
  • 使用ByteArrayOutputStream实现将数据写入本地文件
    目录ByteArrayOutputStream将数据写入本地文件那来了解一下ByteArrayOutPutStream吧在表格输出时FileOutputStream的写入方法把读取的...
    99+
    2024-04-02
  • .Net Core中如何使用SignalR实现斗地主游戏
    本篇内容主要讲解“.Net Core中如何使用SignalR实现斗地主游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.Net Core中如何使用SignalR实现斗地主游...
    99+
    2023-06-26
  • 如何使用 Golang 安全地读取和写入文件?
    在 go 中安全地读取和写入文件至关重要。指南包括:检查文件权限使用 defer 关闭文件验证文件路径使用上下文超时遵循这些准则可确保数据的安全性和应用程序的健壮性。 安全地使用 Go...
    99+
    2024-05-15
    golang 文件操作
  • Linux系统的Java文件学习笔记:如何使用Java编写脚本文件?
    Java作为一种强大的编程语言,在Linux系统中也有广泛的应用。其中,使用Java编写脚本文件可以大大提高开发效率。本文将介绍如何使用Java编写脚本文件。 一、Java编写脚本文件的基本步骤 Java编写脚本文件的基本步骤如下: ...
    99+
    2023-08-30
    文件 学习笔记 linux
  • 利用java如何实现读取本地文件
    利用java如何实现读取本地文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java 读取本地文件实例详解用javax.xml、w3c解析实例代码:package cn.co...
    99+
    2023-05-31
    java 本地文件 ava
  • 如何使用Python实现分布式文件系统?
    分布式文件系统是一种可以将文件储存在多个节点上的文件系统,它可以提高文件系统的可靠性和可扩展性。Python是一种非常流行的编程语言,它可以用来实现分布式文件系统。在本文中,我们将介绍如何使用Python实现分布式文件系统,并提供一些演示代...
    99+
    2023-06-02
    并发 文件 分布式
  • 使用Spring Batch如何实现将txt文件写入数据库
    使用Spring Batch如何实现将txt文件写入数据库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、创建 Maven 项目,并在 pom.xml 中添加依赖<...
    99+
    2023-05-31
    springbatch txt文件
  • 如何用shell脚本实现linux系统文件完整性检测
    这篇文章主要介绍“如何用shell脚本实现linux系统文件完整性检测”,在日常操作中,相信很多人在如何用shell脚本实现linux系统文件完整性检测问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用sh...
    99+
    2023-06-09
  • 如何在Ubuntu系统中使用APT-mirror本地软件仓库
    本篇内容介绍了“如何在Ubuntu系统中使用APT-mirror本地软件仓库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 安装需要的软...
    99+
    2023-06-13
  • 如何实现shell脚本正则匹配文件中的Email并写入到文件中
    本篇内容主要讲解“如何实现shell脚本正则匹配文件中的Email并写入到文件中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现shell脚本正则匹配文件中的Email并写入到文件中”吧!...
    99+
    2023-06-09
  • 如何使用C++编写实现图书管理系统
    这篇文章将为大家详细讲解有关如何使用C++编写实现图书管理系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下为图书管理人员编写一个图书管理系统,图书管理系统的设计主要是实现对图书的管理和相关操...
    99+
    2023-06-29
  • 如何使用Go编写高效的分布式文件系统?
    分布式文件系统是当今互联网时代必备的一种技术,它能够帮助我们在多个服务器上存储和管理大量数据,提高数据的可靠性和可用性。而Go语言作为一种高效且具有并发特性的编程语言,也成为了分布式文件系统开发的首选语言。下面,我们将介绍如何使用Go编写高...
    99+
    2023-08-02
    编程算法 文件 分布式
  • 如何实现导入css文件使用判断条件
    这篇文章主要为大家展示了“如何实现导入css文件使用判断条件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现导入css文件使用判断条件”这篇文章吧。方案一: 在HTML文档中使用条件导入,...
    99+
    2023-06-08
  • 如何在 Golang 中使用管道实现文件读写?
    通过管道进行文件读写:创建一个管道从文件读取数据并通过管道传递从管道中接收数据并处理将处理后的数据写入文件使用 goroutine 并发执行这些操作以提高性能 如何在 Golang 中...
    99+
    2024-05-15
    golang 管道 文件读写
  • Java文件学习笔记:如何在Linux系统中使用Java API读写文件?
    在Java编程中,读写文件是一个非常基础的操作。Java提供了丰富的API用于读写文件,本文将介绍如何在Linux系统中使用Java API读写文件。 一、使用File类操作文件 File类是Java中用于操作文件和目录的类。通过File...
    99+
    2023-08-30
    文件 学习笔记 linux
  • 如何使用C++实现一个简单的文件管理系统?
    如何使用C++实现一个简单的文件管理系统?概述:文件管理系统是计算机中非常重要的一个功能模块,它负责对计算机中的文件进行创建、修改、删除等操作。本文将介绍如何使用C++编程语言实现一个简单的文件管理系统,通过该系统,可以实现对文件的基本管理...
    99+
    2023-11-02
    C++ 实现 文件管理系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作