Logging 如何使用Sitecore修复项目别名的错误日志记录?

Logging 如何使用Sitecore修复项目别名的错误日志记录?,logging,sitecore,log4net,alias,sitecore6,Logging,Sitecore,Log4net,Alias,Sitecore6,我正在使用Sitecore 6.5。有一个多语言配置。我使用带有别名的项目 可以在内容项上创建别名。单击项目>演示文稿>别名。 输入例如:/page/stackoverflow/myitem。单击“确定” 别名现在在内容树中创建,请参见:/sitecore/system/alias/* 别名在内容树中存储为: - page -- stackoverflow --- myitem 每个项目都是所创建别名的一部分 问题 网站网址: 有效别名url: 无效的别名url:或 无效URL(基于创建的

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

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

别名现在在内容树中创建,请参见:/sitecore/system/alias/*

别名在内容树中存储为:

- page
-- stackoverflow
--- myitem
每个项目都是所创建别名的一部分

问题

  • 网站网址:
  • 有效别名url:
  • 无效的别名url:或
无效URL(基于创建的别名)会导致错误日志中出现错误。 51161 12:01:26错误“/page”的别名存在,但指向不存在的项

我想更改:

  • 日志级别为
    INFO/WARN
  • 将此错误记录在单独的错误日志中,或
  • 创建自定义的
    httpRequest
    管道以避免此错误
  • 以上列表按优先顺序排列。除非有更好的可能性来解决这个问题。有没有人经历过这个问题并有一个好的解决方案

    非常感谢


    Jordy

    如果要更改为日志级别(这是最可取的选项),则需要使用原始的
    别名解析程序
    Sitecore创建自己的
    别名解析程序
    类,更改日志记录级别并将其注册到Sitecore配置中,而不是原始的
    别名解析程序中

    
    ...
    ...
    
    使用Sitecore;
    使用Sitecore.Configuration;
    使用Sitecore.Data;
    使用Sitecore.Data.Items;
    使用Sitecore.Diagnostics;
    命名空间My.Assembly.namespace
    {
    公共类别名解析程序:HttpRequestProcessor
    {
    公共覆盖无效进程(HttpRequestArgs args)
    {
    Assert.ArgumentNotNull((object)args,“args”);
    如果(!Settings.AliasesActive)
    {
    Tracer.Warning((对象)“别名未激活”);
    }
    其他的
    {
    Database=Context.Database;
    if(数据库==null)
    {
    Tracer.Warning((object)“AliasResover中没有上下文数据库。”);
    }
    其他的
    {
    探查器。开始操作(“解析别名”);
    if(database.alias.Exists(args.LocalPath)&&&!this.ProcessItem(args))
    this.ProcessExternalUrl(args);
    剖析器内操作();
    }
    }
    }
    私有void ProcessExternalUrl(HttpRequestArgs args)
    {
    字符串targetUrl=Context.Database.alias.GetTargetUrl(args.LocalPath);
    如果(targetUrl.Length 0)
    返回;
    Context.Page.FilePath=路径;
    }
    私有bool ProcessItem(HttpRequestArgs args)
    {
    ID targetId=Context.Database.alias.GetTargetID(args.LocalPath);
    如果(!targetId.IsNull)
    {
    项目目标=args.GetItem(targetId);
    如果(目标!=null)
    this.ProcessItem(args,target);
    返回true;
    }
    其他的
    {
    Tracer.Info((对象)(\“”+args.LocalPath+“\”的别名存在,但指向不存在的项。“);
    返回false;
    }
    }
    私有void ProcessItem(HttpRequestArgs参数,项目标)
    {
    if(Context.Item!=null)
    返回;
    项目=目标;
    Tracer.Info((对象)(“使用指向\”“+(字符串)(对象)target.ID+“\”)的\”“+(对象)args.LocalPath+“\”的别名);
    }
    }
    }
    
    Maras非常合适,但是您应该能够在不使用HttpProcessor的情况下通过“只”在web.config中稍微修改log4net设置来实现这一点。不幸的是,我没有时间为您全面测试这个答案,但我会为您指出我认为您应该寻找的方向

    在web.config中找到
    部分。它定义了一系列“附加器”,每个附加器负责在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>
    
    <logger name="Sitecore.Diagnostics.WebDAV" additivity="false">
      <level value="INFO" />
      <appender-ref ref="WebDAVLogFileAppender" />
    </logger>
    
    
    
    您可以创建自己的appender;e、 g.“AliasLogFileAppender”,并让它将其内容记录到类似
    的地方

    定义好后,只需将其连接到httpRequestPipeline中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>
    
    <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中有一种方法可以将某个错误消息从警告重新映射到信息。然而,此时此刻我对细节一无所知。

    我发现本系列教程非常有助于理解所有log4net选项:哇。这是我喜欢的方式。我发现有可能编写一个匹配规则,请参阅。但是我不知道怎么写正则表达式。有人知道我必须如何为errormessage编写正则表达式吗(见第一篇文章)?可能有,但你不需要使用我在这里列出的解决方案。由于您只从Sitecore.Pipelines.HttpRequest.AliasResolver命名空间捕获日志消息,因此您可以非常确信,在此日志文件中将获得的是您要查找的条目。除非我遗漏了什么?谢谢你的解决方案。不错,但不是我要找的那个。因为当我从Sitecore v6.5更新到Sitecore v6.6或更高版本时会发生什么?我更喜欢使用带有过滤功能的log4net解决方案,将别名错误记录到另一个日志文件或类似文件中。