全局声明log4net变量并在所有类文件中使用它们c#

全局声明log4net变量并在所有类文件中使用它们c#,第1张

概述我有一个用c#编写的类库.在这个库中,我们使用log4net来进行日志记录. 类库有2-3个类文件.这个类库也被一个用c#编写的 windows服务使用. 现在log4net已按以下方式实现. 1.我已经从nuget添加了log4net的引用. 2.在每个类文件中,将其添加到顶部: private static readonly log4net.ILog log = log4net.LogMana 我有一个用c#编写的类库.在这个库中,我们使用log4net来进行日志记录.
类库有2-3个类文件.这个类库也被一个用c#编写的 windows服务使用.

现在log4net已按以下方式实现.
1.我已经从nuget添加了log4net的引用.
2.在每个类文件中,将其添加到顶部:

private static Readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

3.想要打印一些额外的细节以及默认值,所以在log4net.config文件中添加了一些参数,如下所示:

<parametername value="@Parameter1"/><parametername value="@Parameter2"/>

并在布局模式中:

<layout type="log4net.Layout.PatternLayout">     <conversionPattern value="%date{dd/MM/yy HH:mm:ss} [%thread] %level  :: Parameter1 = %property{Parameter1} :: Parameter2 = %property{Parameter2}:: %logger : %message%newline"   /></layout>

并在ClassA中的每个方法中添加了这一行,其中正在进行日志记录:

log4net.GlobalContext.PropertIEs["Parameter1"] = parameter1;log4net.GlobalContext.PropertIEs["Parameter2"] = parameter2;

现在我面临的问题是,我的类库中有2个类文件,名为Class1和Class2.And参数1和参数2是ClassA中的公共变量.正如this问题中提到的,我无法在ClassB中访问paramter1和parameter2.因此,当打印classB方法的日志时,parameter1和parameter2始终为null.

那么有没有一种方法可以全局设置参数一次,每当打印日志时它就会使用相同的变量.

我的代码类似于以下内容:

public ClassA {    public string parameter1 { get; set; } = "ABC"    public string parameter2 { get; set; } = "XYZ"    private static Readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);    public voID SomeMethod(){        log4net.GlobalContext.PropertIEs["Parameter1"] = parameter1;        log4net.GlobalContext.PropertIEs["Parameter2"] = parameter2;        ClassB b = new ClassB();        log.info("In Some Method");        b.AnotherMethod();        LogMessage("After AnotherMethod");      }   }public class ClassB(){    private static Readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);    public voID AnotherMethod(){                log.info("InsIDe AnotherMethod");           }}

预期产出:

30/10/18 21:57:11 [5] INFO  :: Parameter1 = 'ABC' :: Parameter2 = 'XYZ' :: ClassA : In Some Method30/10/18 21:57:11 [5] INFO  :: Parameter1 = 'ABC' :: Parameter2 = 'XYZ' :: ClassB : InsIDe AnotherMethod30/10/18 21:57:11 [5] INFO  :: Parameter1 = 'ABC' :: Parameter2 = 'XYZ' :: ClassA : After AnotherMethod

实际产量:

30/10/18 21:57:11 [5] INFO  :: Parameter1 = 'ABC' :: Parameter2 = 'XYZ' :: ClassA : In Some Method30/10/18 21:57:11 [5] INFO  :: Parameter1 = (null) :: Parameter2 = (null) :: ClassB : InsIDe AnotherMethod30/10/18 21:57:11 [5] INFO  :: Parameter1 = 'ABC' :: Parameter2 = 'XYZ' :: ClassA : After AnotherMethod

如何使参数1和2每次打印或全局声明.所以一旦我设置,它必须被所有log4net消息使用.

在这方面的任何帮助都非常感谢.

解决方法 代码中的这一行:

log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

最终得到2个不同的记录器,因此您在ClassA中为记录器设置的值与ClassB中的记录器不同.尝试将这两行改为:

log4net.LogManager.GetLogger("MyLogger");

它应该工作.

如果您阅读文档,您将看到当您调用使用类型名称加载记录器的this方法时“类型的全名将用作要检索的记录器的名称”.由于代码中有两种不同的类型,因此最终会有两种不同的记录器.您需要使用公共名称或公共类型来获取相同的记录器实例.

你的另一个选择是在设置文件上设置值,但我猜这对你不起作用,因为它们可能是你需要在运行时设置的值.

总结

以上是内存溢出为你收集整理的全局声明log4net变量并在所有类文件中使用它们c#全部内容,希望文章能够帮你解决全局声明log4net变量并在所有类文件中使用它们c#所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存