【问题标题】:Log information from same code to different destinations将相同代码中的信息记录到不同的目的地
【发布时间】:2017-07-14 09:24:03
【问题描述】:

我有一些记录信息的类,它在两个不同的位置使用。

class SomeClass: ISomeClass {
    private ILogger _logger = Log.GetLogger();
    public void Action() {
        _logger.Log("Action started");
        //....
    }
}

class OneUsage {
    ILogger _logger = Logger.GetLogger();
    public OneUsage(ISomeClass someClass) {
        this.someClass = someClass;
    }
    public OtherAction() {
        _logger.Log("Other action started");
        someClass.Action();
    }
}

class SecondUsage {
    ILogger _logger = Logger.GetLogger();
    public SecondUsage(ISomeClass someClass) {
        this.someClass = someClass;
    }
    public OtherAction() {
        _logger.Log("Second Other action started");
        someClass.Action();
    }
}

我需要将日志从 OneUsage 写到一个地方,从 SecondUsage 写到另一个地方。 例如。当我打电话时

oneUsage.OtherAction(); // I want logs to be written to DB

当我打电话时

secondUsage.OtherAction // I want logging to some file

所有这些调用可能同时发生在同一个正在运行的应用程序上。

我可以通过某种方式配置 Log4net 来实现这一点吗? 或者可能有其他方法来处理这个问题?

【问题讨论】:

    标签: .net logging log4net


    【解决方案1】:

    执行此操作的 log4net 方法是配置多个记录器并按名称解析它们。每个记录器都包含一个或多个附加程序(ConsoleAppender、RollingFileAppender 等)。通过解析组件中正确的记录器,您可以定义输出通道。

    配置(见Loggers in Configuration

    <logger name="LoggerOne">
        <level value="DEBUG" />
        <appender-ref ref="ConsoleAppender" />
    </logger>
    <logger name="LoggerTow">
        <level value="DEBUG" />
        <appender-ref ref="AnyCustomAppender" />
    </logger>
    

    正在解决(见Logger hierarchy in Introduction

    class OneUsage {
        ILogger _logger = LogManager.GetLogger("LoggerOne");
        _logger.Log("Message to console.");
    }
    
    class SecondUsage {
        ILogger _logger = LogManager.GetLogger("LoggerTwo");
        _logger.Log("Message custom logging output.");
    }
    

    如果有帮助,请告诉我。

    【讨论】:

    • 嗯,但我需要从外部类解析附加程序的能力,比如从 OneUsage 的调用站点。 //设置适当的记录器 oneUsage.OtherAction(); // 比所有日志都转到上面设置的行
    • 您能否详细解释一下,可能还有代码示例?
    【解决方案2】:

    不要在 SomeClass 中创建记录器,而是将调用类中的记录器作为参数传递给 someclass。

    如果您的 someclass-Instances 始终相同,请将记录器传递给每个方法,如果您有不同的实例,请将记录器传递给构造函数。

    【讨论】:

    • 但我不想用日志记录细节污染我的 API。我问也许有一些常见的解决方案来解决这类问题。
    • 在 appender-configuration 中你可以使用过滤器,但是你想过滤什么?您需要知道调用类,我认为这是不可能的......如果在这个“特殊”类中,您必须使用“父”日志记录配置,请将“父”记录器传递给类而不是类本身的记录器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多