【问题标题】:Programatically force a new log file with Log4Net使用 Log4Net 以编程方式强制一个新的日志文件
【发布时间】:2014-03-26 23:05:26
【问题描述】:

注意:我阅读了这个问题和答案,但它不适用于我想要的:Log4Net: Programmatically specify multiple loggers (with multiple file appenders)

我有一个 WCF 服务,它是一种“问答”式服务。它获取输入并发送输出。它根本不会持久。

我需要将每个问答会话记录在单独的文件中。

我有一个 Appender(目前是 RollingAppender)。

有什么方法可以为每次调用我的 WCF 服务创建一个新的日志文件吗?

注意:我使用的是 XML 布局,其想法是可以解析日志的输出并以图形方式显示(稍后的功能)。有点像“查询计划”。这是我需要将它们放在单独的文件中的另一个原因。

注意:如果需要其他原因,Log4Net XmlLayoutBase 将不会删除 xml 页脚,直到应用程序关闭。对于托管在 IIS 中的 WCF 服务,这并不是真正计划好的事件。

【问题讨论】:

    标签: .net logging log4net


    【解决方案1】:

    这似乎对我有用:

    public static void StartNewFile(this ILog log, string newFileName)
    {
        Logger logger = (Logger) log.Logger;
    
        while (logger != null)
        {
            foreach (IAppender appender in logger.Appenders)
            {
                FileAppender fileAppender = appender as FileAppender;
                if (fileAppender != null)
                {
                    fileAppender.File = newFileName;
                    fileAppender.ActivateOptions();
                }
            }
            logger = logger.Parent;
        }
    }
    

    它需要以下引用:

    using log4net;
    using log4net.Appender;
    using log4net.Repository.Hierarchy;
    

    【讨论】:

    • 在代码中我将把这个方法称为“StartNewFile”的地方
    【解决方案2】:

    也许您可以尝试记录到数据库表并使用记录的数据记录会话 ID,而不是记录到文件。这样您就可以根据会话 ID 对表进行选择,并且只查看它们的数据。

    【讨论】:

    • 问题是我的 xml 日志记录系统中有多个节点级别。它不能很好地映射到静态数据库表。我“可以”将 XML 放入数据表中,但我通常尽量不要混合使用 XML 和 SQL。我发现它会导致复杂的查询并且难以维护客户端。
    • 当我的代码工作时,我最终会进入数据库。所以我给你的问题“答案”。
    【解决方案3】:

    也许不是您正在寻找的确切解决方案,但您可以通过在每个接口调用开始时调用它来为每个会话创建不同的记录器:

    ILog logger = LogManager.GetLogger(<SessionID>);

    您将在同一个日志文件中获得所有条目,但随后可以很容易地使用诸如log4view 之类的查看器分别查看每个会话。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2015-04-27
      • 1970-01-01
      • 2018-03-22
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多