热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:每个类实例的唯一日志文件分享

每个类实例的唯一日志文件我目前正在运行一个Windows服务,它创建了一个类的多个实例。在服务类的顶部和我的解决方案中的每个其他类,我有这样的事情:privatestaticrea

每个类实例的唯一日志文件

我目前正在运行一个Windows服务,它创建了一个类的多个实例。

在服务类的顶部和我的解决方案中的每个其他类,我有这样的事情:

private static readonly ILog _log = LogManager.GetLogger(typeof(SomeClassTypeHere)); 

在我的App.config中,我为单个文件配置了Log4Net:

                    

这在大多数方面都很有效,并且所有内容都记录到单个文件中。 但是,我真的想为我的服务创建的特定类的每个实例创建一个单独的日志文件。
这是一个我们经常需要监视以获得支持的类,我们可以同时运行少量实例。
我们不知道哪些实例将在给定时间运行,因此它使得在配置中创建静态文件有点痛苦。

我尝试取消readonly修饰符并在类构造函数中设置以下内容:

 _log = LogManager.GetLogger("DataCollectionClass_" + deviceName + "_" + DateTime.Now.ToString("MMddyyyy"), typeof(SomeClassTypeHere)); 

但这需要我在配置中手动定义一个appender,这很麻烦,很难跟上。

有关在L4N中这样做的任何想法吗? 我在这里看过链接,但不知道是否需要那么多的框架。

下面的代码显示了如何在不使用配置文件的情况下以编程方式配置log4Net以实现您正在寻找的效果。 基本上,它只涉及创建一个命名的记录器并添加到层次结构中。

我用这里的答案作为起点之一。

 using log4net; using log4net.Appender; using log4net.Layout; using log4net.Repository.Hierarchy; namespace LoggerTest { class Program { static void Main(string[] args) { DeviceConnection dev1 = new DeviceConnection("Device1"); DeviceConnection dev2 = new DeviceConnection("Device2"); dev1.DoSomething(); dev2.DoSomething(); } } public class DeviceConnection { private string name; private readonly ILog logger; public DeviceConnection(string _name) { name = _name; logger = TestLogger.AddNamedLogger(name); logger.Info("---- Begin Logging for DeviceConnection: " + name); } public void DoSomething() { logger.Info("Doing something for device connection " + name); } } public static class TestLogger { private static PatternLayout _layout = new PatternLayout(); private const string LOG_PATTERN = "%d [%t] %-5p %m%n"; public static string DefaultPattern { get { return LOG_PATTERN; } } static TestLogger() { _layout.COnversionPattern= DefaultPattern; _layout.ActivateOptions(); Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); hierarchy.COnfigured= true; } public static PatternLayout DefaultLayout { get { return _layout; } } public static ILog AddNamedLogger(string name) { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); Logger newLogger = hierarchy.GetLogger(name) as Logger; PatternLayout patternLayout = new PatternLayout(); patternLayout.COnversionPattern= LOG_PATTERN; patternLayout.ActivateOptions(); RollingFileAppender roller = new RollingFileAppender(); roller.Layout = patternLayout; roller.AppendToFile = true; roller.RollingStyle = RollingFileAppender.RollingMode.Size; roller.MaxSizeRollBackups = 4; roller.MaximumFileSize = "100KB"; roller.StaticLogFileName = true; roller.File = name + ".log"; roller.ActivateOptions(); newLogger.AddAppender(roller); return LogManager.GetLogger(name); } } } 

使用ADO.Net appender并登录到SQL Server数据库,只查询所需的信息。

另一种选择是log4net仪表板: http ://www.l4ndash.com/。 它可以很好地集成来自各种来源的日志,然后以不同的方式对它们进行切片和切割。 价格也合理。

log4net有一个名为logger hierarchy的概念。

如果记录器的名称后跟一个点是后代记录器名称的前缀,则称该记录器是另一个记录器的祖先。 如果记录器本身和后代记录器之间没有祖先,则称记录器是子记录器的父节点。 层次结构的工作方式与.NET中的命名空间和类层次结构非常相似。 这很方便,我们很快就会看到。

所以你真的应该用它来创建特定于实例的记录器. 字符而不是_字符。

 _log = LogManager.GetLogger("DataCollectionClass." + deviceName + "." + DateTime.Now.ToString("MMddyyyy"), typeof(SomeClassTypeHere)); 

然后在配置文件中引用记录器层次结构,如下所示。

       

请注意记录器名称引用如何不包含代码中使用的完全限定名称。 它只引用名称的根。 您可以像想象名称空间一样考虑它。

我有一篇文章可能有所帮助:

http://horth.com/blog/?p=165

这是关于在运行时更改日志文件。 您可以做的是将每个实例的文件名传递到log4net文件中。 这样,您就可以为类的每个实例创建一个日志文件。 这样您的配置文件很简单,但您可以灵活地为每个类实例创建新的日志文件。

上面提到过,您可以使用每个实例的指示器登录数据库。 如果您不想购买任何东西,请使用允许10GB数据库的SQL Express。 您甚至可以直接写入MDF文件而不是安装SQL。

上述就是C#学习教程:每个类实例的唯一日志文件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
难耐五更寒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有