2014-01-07 11 views
3

我正在使用Sitecore 6.5。有一個多語言配置。我使用具有別名的項目。如何使用Sitecore修復項目別名的錯誤日誌記錄?

別名可以在內容項目上創建。點擊項目>演示文稿>別名。 輸入例如:/ page/stackoverflow/myitem。點擊確定。

別名在內容樹中創建的,現在,請參閱:/Sitecore的/系統/別名/ *

別名被存儲在內容樹:

- page 
-- stackoverflow 
--- myitem 

每個產品創建的別名的一部分。

問題。

無效的網址(基於創建別名)在錯誤日誌中導致錯誤。 51161 12:01:26錯誤存在「/ page」的別名,但指向不存在的項目。

我想改變:

  1. 日誌級別INFO/WARN
  2. 登錄這個錯誤在一個單獨的錯誤日誌或
  3. 創建自定義httpRequest管道,以避免這個錯誤。

以上列表是按照首選順序。除非有更好的可能性來解決這個問題。有沒有人遇到過這個問題,並有一個很好的解決方案?

非常感謝。

的Jordy

回答

4

Maras已經出現,但是您應該可以在沒有HttpProcessor的情況下實現這一點,通過在web.config中使用log4net設置來「擺弄」一下。我不幸沒有時間爲你全面檢驗這個答案,但我會指出你認爲你應該看的方向。

在web.config中找到<log4net>部分。它定義了一系列「appender」,每個appender負責在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> 

您可以創建自己的appender;例如「AliasLogFileAppender」,並將其內容記錄到<file value="$(dataFolder)/logs/Aliaslog.{date}.txt" />之類的內容中。

定義好之後,您只需將其連接到httpRequestPipeline中的Sitecore自己的別名解析器的名稱空間即可。請看appenders下面的<logger>定義。它們看起來像這樣:

<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的某個錯誤消息重新映射。但是,細節在這一刻逃避了我。

+0

我發現這個系列教程非常適合理解所有的log4net選項:http://www.beefycode.com/post/Log4Net-Tutorial-pt-7-Filters.aspx – jammykam

+0

哇。這是我喜歡的方式。我發現有可能編寫RegexToMatch規則,請參閱http://osdir.com/ml/log.log4net.user/2005-04/msg00006.html。但我不知道如何編寫正則表達式。有誰知道我必須如何編寫errormessage的正則表達式(請參閱第一篇文章)? – Jordy

+0

可能有,但你不應該需要與我在這裏列出的解決方案。由於您只是從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 + "\"")); 
    } 
    } 
} 
+0

謝謝你的解決方案。這是一個很好的,但不是我正在尋找的那個。因爲當我從Sitecore v6.5更新到Sitecore v6.6或更高版本時發生了什麼?我更喜歡使用log4net進行過濾的解決方案,將別名錯誤記錄到另一個日誌文件或類似的東西。 – Jordy