【问题标题】:How to fix error logging for item aliases using Sitecore?如何使用 Sitecore 修复项目别名的错误日志记录?
【发布时间】:2014-01-08 17:23:40
【问题描述】:

我使用的是 Sitecore 6.5。有一个多语言配置。我使用带有别名的项目。

可以在内容项上创建别名。单击项目 > 演示文稿 > 别名。 输入例如:/page/stackoverflow/myitem。点击确定。

现在在内容树中创建了别名,请参阅:/sitecore/system/Aliases/*

别名在内容树中存储为:

- page
-- stackoverflow
--- myitem

每个项目都是创建的别名的一部分。

问题。

无效的 url(基于创建的别名)导致错误日志中的错误。 51161 12:01:26 错误“/page”的别名存在,但指向不存在的项目。

我想改变:

  1. 日志级别为INFO/WARN
  2. 将此错误记录在单独的错误日志中或
  3. 创建自定义httpRequest 管道以避免此错误。

以上列表按首选顺序排列。除非有更好的可能性来解决这个问题。有没有人遇到过这个问题并有好的解决方法?

非常感谢。

乔迪

【问题讨论】:

    标签: logging sitecore log4net alias sitecore6


    【解决方案1】:

    Maras 是正确的,但您应该能够在没有 HttpProcessor 的情况下实现这一点,只需“稍微”摆弄一下 web.config 中的 log4net 设置。不幸的是,我没有时间为您全面测试此答案,但我会为您指明我认为您应该寻找的方向。

    在 web.config 中找到 <log4net> 部分。它定义了一系列“附加器”,每个附加器负责在您的 Sitecore 解决方案中创建不同的日志文件。它们看起来像这样:

    <appender name="LogFileAppender" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
      <file value="$(dataFolder)/logs/log.{date}.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n" />
      </layout>
    </appender>
    

    您可以创建自己的附加程序;例如“AliasLogFileAppender”并将其内容记录到 &lt;file value="$(dataFolder)/logs/Aliaslog.{date}.txt" /&gt; 之类的东西。

    定义后,您只需将其连接到 httpRequestPipeline 中 Sitecore 自己的别名解析器的命名空间。查看 appenders 下方的 &lt;logger&gt; 定义。它们看起来像这样:

    <logger name="Sitecore.Diagnostics.WebDAV" additivity="false">
      <level value="INFO" />
      <appender-ref ref="WebDAVLogFileAppender" />
    </logger>
    

    “name”属性实际上表示命名空间,它将触发记录器。

    所以你的配置应该是这样的:

    <logger name="Sitecore.Pipelines.HttpRequest.AliasResolver" additivity="false">
      <level value="INFO" />
      <appender-ref ref="AliasLogFileAppender" />
    </logger>
    

    再次抱歉,无法在发布之前对此进行测试。但是我不明白为什么它不起作用。

    我确实相信 log4net 中有一种方法可以将某个错误消息从 WARN 重新映射到 INFO。然而,此时此刻,细节让我无法理解。

    【讨论】:

    • 我发现这个教程系列非常适合理解所有 log4net 选项:beefycode.com/post/Log4Net-Tutorial-pt-7-Filters.aspx
    • 哇。这是我喜欢的方式。我发现可以编写 RegexToMatch 规则,请参阅 osdir.com/ml/log.log4net.user/2005-04/msg00006.html 。但我不知道如何编写正则表达式。有谁知道我必须如何为错误消息编写正则表达式(见第一篇文章)?
    • 可能有,但您不需要使用我在此处列出的解决方案。由于您仅从 Sitecore.Pipelines.HttpRequest.AliasResolver 命名空间捕获日志消息,因此您可以非常确信在此日志文件中获得的内容就是您所追求的条目。除非我错过了什么?
    【解决方案2】:

    如果您想更改日志级别(这是最可取的选项),您需要使用来自 Sitecore 的原始 AliasResolver 代码创建自己的 AliasResolver 类,更改日志级别并将其注册到 Sitecore 配置 而不是原来的 AliasResolver:

    <httpRequestBegin>
      ...
      <processor type="My.Assembly.Namespace.AliasResolver, My.Assembly" />
      ...
    </httpRequestBegin>
    
    using Sitecore;
    using Sitecore.Configuration;
    using Sitecore.Data;
    using Sitecore.Data.Items;
    using Sitecore.Diagnostics;
    
    namespace My.Assembly.Namespace
    {
      public class AliasResolver : HttpRequestProcessor
      {
        public override void Process(HttpRequestArgs args)
        {
          Assert.ArgumentNotNull((object) args, "args");
          if (!Settings.AliasesActive)
          {
            Tracer.Warning((object) "Aliases are not active.");
          }
          else
          {
            Database database = Context.Database;
            if (database == null)
            {
              Tracer.Warning((object) "There is no context database in AliasResover.");
            }
            else
            {
              Profiler.StartOperation("Resolve alias.");
              if (database.Aliases.Exists(args.LocalPath) && !this.ProcessItem(args))
                this.ProcessExternalUrl(args);
              Profiler.EndOperation();
            }
          }
        }
    
        private void ProcessExternalUrl(HttpRequestArgs args)
        {
          string targetUrl = Context.Database.Aliases.GetTargetUrl(args.LocalPath);
          if (targetUrl.Length <= 0)
            return;
          this.ProcessExternalUrl(targetUrl);
        }
    
        private void ProcessExternalUrl(string path)
        {
          if (Context.Page.FilePath.Length > 0)
            return;
          Context.Page.FilePath = path;
        }
    
        private bool ProcessItem(HttpRequestArgs args)
        {
          ID targetId = Context.Database.Aliases.GetTargetID(args.LocalPath);
          if (!targetId.IsNull)
          {
            Item target = args.GetItem(targetId);
            if (target != null)
              this.ProcessItem(args, target);
            return true;
          }
          else
          {
            Tracer.Info((object) ("An alias for \"" + args.LocalPath + "\" exists, but points to a non-existing item."));
            return false;
          }
        }
    
        private void ProcessItem(HttpRequestArgs args, Item target)
        {
          if (Context.Item != null)
            return;
          Context.Item = target;
          Tracer.Info((object) ("Using alias for \"" + (object) args.LocalPath + "\" which points to \"" + (string) (object) target.ID + "\""));
        }
      }
    }
    

    【讨论】:

    • 感谢您的解决方案。这是一个很好的,但不是我要找的那个。因为当我从 Sitecore v6.5 更新到 Sitecore v6.6 或更高版本时会发生什么?我更喜欢带有过滤功能的 log4net 解决方案,将别名错误记录到另一个日志文件或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多