log4net:在哪里放置静态LogManger对象? (在解决方案的不同项目中使用它,每个项目都有一个单独的配置文件)

问题描述 投票:0回答:1

到目前为止,我还没有与配置文件联系。因此,与此相关的是,我认为我在初次使用log4net时缺少一些基本知识以完全理解。


这是我已经读过的内容:

https://stackify.com/log4net-guide-dotnet-logging

https://csharp.today/log4net-tutorial-great-library-for-logging

log4net configuration with [assembly:]


让我们说解决方案中有三种不同类型的项目,每个项目都附加了log4net:

  • 项目中级:.NET Framework 4.6.1(使用低级)
  • Project LowLevel:.NET Standard 2.0
  • 项目应用程序:.NET Framework 4.6.1(使用低级和中级)

1)我应将以下几行准确放置在哪里?在我想登录的每个班级?

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

2)我想知道如何在要使用它的任何地方上方获得静态对象。因此,我在项目LowLevel中添加了如下所示的类,希望只是“使用”会有所帮助。

using System;
using System.Collections.Generic;
using System.Text;

using log4net;

namespace LowLevel.NuGet.Log4Net
{
    public class Log4Net
    {
        // Avoiding overhead by logging, reducing use of CPU via static LogManager object.
        private static readonly log4net.ILog _log
            = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        //
        // Properties
        //

        public static log4net.ILog Log { get => _log; }
    }
}

但是我建议我不会工作,因为.NET Standard 2.0项目没有自己的配置文件。

  • 我是对的吗? (当然,我也会自己检查这个问题。但是,如果您事先指出我的信息,这可能会有所帮助。)
  • 如何创建一个静态LogManager对象,并在每个项目中使用它?
  • 提到静态LogManger对象会使用每个项目的不同配置文件吗?如果没有,如何实现呢?

非常感谢。

c# .net logging config log4net
1个回答
0
投票

第1部分:LogManager.GetLogger

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

我真的不知道为什么马特建议这个可憎的东西(恕我直言)。是的,您可以简单地将其复制并粘贴到您要记录的每个类中,但是反射是slow

尽管事实是,LogManager应该为同一类提供相同的Logger实例,但is建议将其设为静态,以避免调用LogManager。这应该提高性能,尤其是当您有经常实例化的日志记录类时。

在log4net文档(以及我自然会做的事情)中,替代方法是这样:

private static readonly ILog log = LogManager.GetLogger(typeof(ClassName));

缺点:您在那里有一个类名,因此没有简单的C&P。

BUT如果使用重构功能更改类名,Visual Studio将对其进行更改,并且您可以定义快捷方式/模板来自动地填充类名。但是,即使您手动执行此操作,与反射相比,我还是会喜欢它。

供参考:typeof operatorlang-reference: typeof

第2部分:配置

使用库进行日志记录配置实际上没有任何意义。它们不会“独立”执行。您将要做的是利用名称空间。

[给出库A和B,名称空间为“ my.prj.A”和“ my.prj.B”,以及“主”应用程序“ my.prj.App”,那么您将拥有一个配置该应用程序。但是,您仍然可以应用其他设置/附加程序:

log4net跨越一棵配置继承树(如其“配置”和“入门”文档中所述)。因此,您将always拥有一个根记录器。如果没有其他记录器,这是默认值或后备选项。

然后,您可以定义子记录器(我的说法,不确定他们叫什么),例如:

  • logger“ my.prj”,如果没有其他特定的记录器适用,则将应用于从typeof(my.prj.*.SomeClass)创建的所有记录器。没道理吗是的,它可以-它将not适用于例如第三方库。如果他们碰巧使用log4net,它们将退回到root。

  • logger“ my.prj.A”将应用于库A中的所有类。

  • logger“ my.prj.B.SomeFeatureNamespace”将适用于库B中FeatureNamespace中的所有类。

...你明白了。

BTW:使用... = LogManager.GetLogger("MySuperSpecialLogger");可以为“ MySuperSpecialLogger”定义一个配置,该配置在调试时会派上用场,因为您可以“遵循”类之间的某些流,并且可以轻松地按记录器名称过滤日志或使用它写入其他文件等或者,您可以汇总loginput以获得文档。例如,您有3种登录方法,但需要记录尝试和成功/失败的日志:您可以为此创建一个命名记录器,并将其连接到自己的附加程序,在3种​​实现中获取它,并编写日志登录尝试/成功/失败的输出-完成。


对libs进行no配置也有其他效果:

  • 如果您实际上重复使用它们,则每个解决方案都可以为其定义不同的日志记录配置。
  • 您可以关闭登录单元测试项目的记录。
  • 如果您(或其他人)在使用其他日志记录框架的项目中使用它们,您也许仍然可以记录日志,但配置可能来自外观或适配器。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.